2015-05-12 102 views
2

改變中間對象我有一個大的基因敲除的ViewModel這是其中JSON表示:訂閱在knockoutjs視圖模型

... 
existingPlans: { 
    startDate: "2014-11-01", 
    endDate: "2017-03-01", 
    plans: [ 
     { 
      "customTitle": "plan 1 name", 
      "monthlyPayments": [ 15000, 15000, 15000, 15000, 15000, 15000 ], 
      "futureBalance": [ 90000, 75000, 60000, 45000, 30000, 15000 ] 
     }, 
     { 
      "customTitle": "plan 2 name", 
      "monthlyPayments": [ 7000, 7000, 7000, 7000 ], 
      "futureBalance": [ 28000, 21000, 14000, 7000 ] 
     } 
    ] 
} 
... 

的StartDate和結束日期是可觀測量和計劃是observableArray。 我想要做的是創建一個綁定,當這三個可觀察對象中的任何一個在「existingPlans」級別發生改變時觸發。

我可以做一個計算字段,取決於所有三個,但沒有一個更簡單的方法做到這一點?

喜歡的東西下面的例子並不因爲existingPlans工作本身不能觀察到的(是嗎?)

viewModel.existingPlans.subscribe(function(newValue) { 
    // do stuff with newValue.startDate(), etc 
}) 

回答

1

這取決於當這些屬性發生改變應該發生什麼。如果你只是想如果你需要計算的東西或從的價值提出了一些結果觸發一個事件或類似的東西,你可以訂閱屬性,並使用同一申購處理程序對他們來說,這樣的

function ExistingPlans() { 
    this.startDate = ko.observable(); 
    this.endDate = ko.observable(); 
    this.plans = ko.observableArray(); 

    this.startDate.subscribe(this.handleChange, this); 
    this.endDate.subscribe(this.handleChange, this); 
    this.plants.subscribe(this.handleChange, this);      
} 

ExistingPlans.prototype.handleChange = function() { 
    // do stuff 
}; 

屬性我會創建一個計算觀察值。

+0

好的,所以我必須在任何情況下通過可觀察的孩子?綁定到JSON樹更高的東西不是一種選擇? – koenpeters

+0

我可能誤解了你的問題。如果ExistingPlans實體存在於父視圖模型中,則可以以類似方式訂閱屬性,如'this.existinPlans.startDate.subscribe(this.handleChange,this)',然後將'handleChange'方法添加到父視圖模型中。 – lagerone

+1

你不能只觀察根對象,因爲敲除正在觀察引用的變化,所以即使你修改了子對象,引用仍然是一樣的,所以你需要像上面那樣向所有子項添加訂閱者 – Luis

0

由於您正在處理三種不同的觀察對象,因此無法使用手動訂閱。計算可觀察性是要走的路。一個計算觀察到的自動監視所有可觀測量你的訪問,因此將只是工作:

ko.computed(function() { 
    // do stuff with existingPlans.startDate(), etc 
}); 

如果你想絕對確保你訂閱的所有在一個視圖模型的可觀察的,你可以使用ko.toJS

ko.computed(function() { 
    ko.toJS(existingPlans); 
    // do stuff with existingPlans.startDate(), etc 
});