2017-01-12 1 views
1

Je suis nouveau sur KO et j'ai de la difficulté à obtenir une valeur calculée pour fonctionner. J'ai un viewmodel composé de nombreux objets parce que j'ai beaucoup de tables différentes dans la base de données dont je récupère des données. Ceci est un exemple de la façon dont j'ai mis la VM en place. Ne hésitez pas à critiquer tout ce que je fais mal ici (même si cela ne fonctionne en dehors de la valeur calculée):Knockoutjs - Champs locaux de référence dans le calcul observé

var viewModel = function(object1, object2...) { 
    var self = this; 
    var activeProductCodes = ['AB-1', 'AB-2', 'AB-3']; 

    self.myFirstObject = ko.observable({ 
     field1: ko.observable(object1.field1), 
     field2: ko.observable(object1.field2), 
     field3: ko.observable(object1.field3) 
    }); 


    self.mySecondObject = ko.observable({ 
     productCode: ko.observable(object2.productCode), 

     isActiveProduct: ko.computed(function() { 
      return self.activeProductCodes.indexOf(productCode) !== -1 ? true : false; 
     }, self) 
    }); 
} 

isActiveProduct ne fonctionne pas parce qu'il ne sait pas ce que productCode est. J'ai essayé de faire this.productCode, self.productCode, self.mySecondObject(). ProductCode, aucun d'entre eux ne semble fonctionner. Est-il possible d'accéder à la valeur? Est-ce que quelque chose ne va pas dans ma configuration globale de machine virtuelle qui cause l'échec?

Merci

Steve

MISE À JOUR: Je suis maintenant ne pas faire les objets observables et déclarant ma machine virtuelle comme si:

var viewModel = function(object1, object2...) { 
    var self = this; 
    var activeProductCodes = ['AB-1', 'AB-2', 'AB-3']; 

    self.myFirstObject = { 
     field1: ko.observable(object1.field1), 
     field2: ko.observable(object1.field2), 
     field3: ko.observable(object1.field3) 
    } 

    self.mySecondObject = { 
     productCode: ko.observable(object2.productCode), 

     isActiveProduct: ko.computed(function() { 
      return self.activeProductCodes.indexOf(productCode) !== -1 ? true : false; 
     }, self) 
    } 
} 
+0

Pourquoi 'mySecondObject' existe-t-il? Pourquoi ne pas avoir à la fois 'productCode' et' isActiveProduct' sur 'viewModel'? Une autre question - attendez-vous 'm6yFirstObject' et' mySecondObject' à changer du tout? Sinon, ils devraient être – Jamiec

+0

POJO Parce que le produit appartient au deuxième objet. Il y a beaucoup d'objets dans le modèle de vue que je dois afficher sur la page, j'ai un ticket d'assistance, le produit avec lequel ils ont le problème, les détails de toute visite d'ingénieur, etc qui sont stockés dans des tables séparées dans la base de données. avoir à interroger séparément. En réalité, il y a plus près de 10 objets. J'ai trouvé quand je mettais la VM en place que si je ne rendais pas les objets eux-mêmes observables que la page n'a pas reçu de mises à jour – ministe2003

+0

Sauf si vous changez l'objet * entier * pour un autre objet, il n'a pas besoin d'être observable. Si vous changez seulement les * champs * de l'objet, rendez simplement ces champs observables. Lorsque vous chargez une mise à jour à partir du serveur, mettez à jour les champs eux-mêmes et non l'objet entier – Jamiec

Répondre

1

La brève discussion dans les commentaires de côté, quand je traiter Avec les modèles sous-view dans knock-out, j'ai tendance à les définir correctement, au lieu d'utiliser des objets anonymes. Donc, dans votre cas qui pourrait ressembler à ceci

var viewModel = function(object1, object2...) { 
    var self = this; 
    var activeProductCodes = ['AB-1', 'AB-2', 'AB-3']; 

    self.myFirstObject = ko.observable(new myFirstViewModel(object1)); // omitted for brevity 

    self.mySecondObject = ko.observable(new mySecondViewModel(object2, activeProductCodes)); 
} 

var mySecondViewModel = function(object2, activeProductCodes){ 
    var self = this; 

    self.productCode = ko.observable(object2.productCode); 
    self.isActiveProduct = ko.computed(function() { 
      return activeProductCodes.indexOf(self.productCode()) !== -1 ? true : false; 
    }, self) 
} 

J'ai aussi mentionné que theres une bonne chance que vous ne avez pas besoin sous viewmodels être réellement observables, de sorte que vous pourriez sortir avec ceci:

self.mySecondObject = new mySeocndViewModel(object2, activeProductCodes); 

Cela dépend de votre cas d'utilisation.

+0

Merci, je suis mise à jour le code que nous parlons, rendra compte! – ministe2003

+0

est-ce que les deux-points à l'intérieur de mySecondViewModel ne devraient pas être des signes égaux? – ministe2003

+0

oui. mise à jour maintenant (copier/coller échouer) – Jamiec