2017-10-18 114 views
1

我在淘汰賽應用的observableArray,如下圖所示可觀察家長:淘汰賽,當孩子被刪除

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'}]) 
    }]); 

而且我有Parents可變computed observable如下圖所示:

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

現在,當我添加/刪除孩子的任何家長,我相信上面計算函數應該被稱爲父變量間接得到更新時,我添加/刪除孩子。但它不起作用。作爲低於小提琴的解決方案,應該顯示Record Updated警報。

Fiddle - Code Snippet

所以,我怎麼能做到這一點?

注意:請注意,這只是我創建的示例。在實際場景中,Parents對象被傳遞給第三方網格庫。如果父/子發生任何更改,網格應該更新。這就是爲什麼我在computed function書面self.Parents(),而不是Children

+0

嗨,你有沒有解決問題? – adiga

+0

@adiga:是的。作爲我的回答發佈解決方案 – user2988458

回答

0

我已經修復了我自己的解決方案。

刪除子行,下面的代碼會通知父母行之後的子數據已經改變:

self.Parents.valueHasMutated() 
1

可以使用ko.toJs在對象上創建的每個觀察到的依賴的原因。

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

你可以做computed物業內的操作。但computed屬性裏面的邏輯似乎是錯誤的,所以你創建認購,computedToJS屬性:你,這個被觸發的所有observables

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. 
    }); 

心靈。如果您要將Father屬性更改爲observable並更新屬性,則計算得到的值會再次觸發。

Here's an updated fiddle

你可以通過this blog post使用創造了淘汰賽髒標誌ko.toJS


或者,你可以創建一個ParentViewModel並添加subscribeChildrenobservableArraywhich is available from Knockout 3.0+。例如,您可以通過this question