我有一个带有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
});
});
});
这是正确的方法还是有更好的方法?
答案 0 :(得分:20)
这接近正确。可观察数组订阅仅适用于添加或删除项目而不进行修改的情况。因此,如果您想订阅一个项目本身,您需要订阅该项目本身:
关键点:observableArray跟踪数组中的对象,而不是这些对象的状态
简单地将对象放入observableArray并不会使该对象的所有属性本身都可观察到。当然,如果您愿意,您可以观察这些属性,但这是一个独立的选择。 observableArray只跟踪它所拥有的对象,并在添加或删除对象时通知侦听器。
我说“接近正确”因为您要删除所有旧订阅。目前,如果可观察数组以[a, b]
开头,则您订阅了[a, b]
,但如果添加了c
,则您有两个订阅a
和b
加上一个用于c
。