2017-10-18 1 views
1

j'ai un observableArray dans ma demande de knock-out comme indiqué ci-dessous:knock-out Observable Parent lorsque l'enfant est enlevé

self.Parents = ko.observableArray([ 
    { 
     Father: 'Father-A', 
     Mother: 'Mother-A', 
     Children: ko.observableArray([ 
     {Name: 'Child-A1'}, 
     {Name: 'Child-A2'}, 
     {Name: 'Child-A3'}]) 
    }, 
    { 
     Father: 'Father-B', 
     Mother: 'Mother-B', 
     Children: ko.observableArray([ 
     {Name: 'Child-B1'}, 
     {Name: 'Child-B2'}, 
     {Name: 'Child-B3'}]) 
    }]); 

Et je computed observable sur la variable Parents comme indiqué ci-dessous:

ko.computed(function(){ 
    alert('Record Updated'); 
    console.log(self.Parents()); 
}); 

Maintenant, quand je ajouter/supprimer des enfants à l'un des parents, je crois que la fonction calculée ci-dessus doit être appelée en tant que variable parent est indirectement mise à jour lorsque j'ajoute/supprime l'enfant. Mais ça ne fonctionne pas. Comme une solution de ci-dessous violon, l'alerte Record Updated devrait être affichée.

Fiddle - Code Snippet

Alors, comment puis-je y parvenir?

Note: ici s'il vous plaît prendre note que ceci est juste un échantillon que je l'ai créé. Dans un scénario réel, l'objet Parents est transmis à la bibliothèque de grille tierce. Et si un changement survient dans Parent/Child, cette grille devrait être mise à jour. C'est la raison pour laquelle je l'ai écrit dans self.Parents()computed function et non Children

+0

Salut, avez-vous résolu votre problème? – adiga

+0

@adiga: Oui. Solution publiée comme ma réponse. – user2988458

Répondre

0

J'ai résolu la solution moi-même.

Après avoir retiré ligne enfant, ci-dessous ligne de code informera les parents que les données de l'enfant a été changé:

self.Parents.valueHasMutated() 
1

Vous pouvez utiliser ko.toJs pour créer une dépendance à chaque observable dans un objet.

ko.computed(function() { 
    alert("Children Array changed"); 
    return ko.toJS(self.Parents()); 
}); 

Vous pouvez faire vos opérations à l'intérieur de la propriété computed. Mais la logique dans une propriété computed semble mal, alors vous créez un abonnement à cette computedToJS propriété:

self.isDirty = ko.observable(false); 

    self.computedToJS = ko.computed(function() { 
    return ko.toJS(self.Parents()); 
    }); 

    self.computedToJS.subscribe(function(value){ 
    self.isDirty(true); 
    // Do all your stuff here. 
    }); 

Rappelez-vous, ce se déclenche pour tous les observables. Si vous deviez modifier la propriété Father en observable et mettre à jour la propriété, le calcul est à nouveau déclenché.

Here's an updated fiddle

Vous pouvez passer par this blog post sur la création de drapeaux sales à élimination directe à l'aide ko.toJS


Sinon, vous pouvez créer un ParentViewModel et ajouter un subscribe au ChildrenobservableArraywhich is available from Knockout 3.0+. Vous pouvez passer par this question pour un exemple.