订阅knockoutjs viewmodel中对中间对象的更改

时间:2015-05-12 19:36:25

标签: javascript mvvm knockout.js

我有一个大型的淘汰视图模型,它是一个JSON表示:

...
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和endDate是observables,plan是observableArray。 我想要做的是创建一个绑定,当这三个可观察者中的任何一个在" existingPlans"的级别上发生变化时触发。

我可以创建一个取决于所有三个的计算字段,但是不是更简单的方法吗?

以下示例之类的东西不起作用,因为现有的本身不能被观察(对吗?)

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

2 个答案:

答案 0 :(得分:1)

这取决于这些属性发生变化时应该发生什么。如果你只是想触发一个类似的事件,你可以订阅属性并为它们使用相同的订阅处理程序,比如这个

  <div id="Main">

    <div id="RightColumn-Template">
    <p>Hey</p>
      <p>Hey</p><p>Hey</p><p>Hey</p>
    </div>

    <div id="LeftColumn-Template">
    <p>Hey</p>
    </div>
    </div>

如果您需要计算某些东西或从属性值中提供一些结果,我会创建一个计算的observable。

答案 1 :(得分:0)

由于您正在处理三种不同的可观察对象,因此您无法使用手动订阅。计算的可观察量是要走的路。计算出的observable会自动监视您访问的所有可观察对象,因此只会工作:

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

如果您想绝对确保订阅了视图模型中的所有可观察对象,可以使用ko.toJS

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