Knockout.JS可观察数组对单个可观察项目的更改

时间:2012-03-15 18:47:27

标签: javascript knockout.js

我有一个带有observableArray(名为“all”)对象的视图模型。该对象的一个​​属性是选择了observable名称。我想要一些代码在数组中子对象的selected属性发生变化时执行。我尝试通过all手动订阅all.subscribe()但该代码仅在添加或删除项目时触发。我更新了代码,就像这样:

all.subscribe(function () {
    ko.utils.arrayForEach(all(), function (item) {
        item.selected.subscribe(function () {
            //code to fire when selected changes
        });
    });
});

这是正确的方法还是有更好的方法?

1 个答案:

答案 0 :(得分:20)

这接近正确。可观察数组订阅仅适用于添加或删除项目而不进行修改的情况。因此,如果您想订阅一个项目本身,您需要订阅该项目本身:

  

关键点:observableArray跟踪数组中的对象,而不是这些对象的状态

     

简单地将对象放入observableArray并不会使该对象的所有属性本身都可观察到。当然,如果您愿意,您可以观察这些属性,但这是一个独立的选择。 observableArray只跟踪它所拥有的对象,并在添加或删除对象时通知侦听器。

from Knockout documentation


我说“接近正确”因为您要删除所有旧订阅。目前,如果可观察数组以[a, b]开头,则您订阅了[a, b],但如果添加了c,则您有两个订阅ab加上一个用于c