2015-05-12 54 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 
});