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

Javascript Knockout.JS可观察数组对单个可观察项的更改,javascript,knockout.js,Javascript,Knockout.js,我有一个视图模型,其中包含一个对象的可观察阵列(名为“all”)。该对象的属性之一是所选的可观察的名称。我希望在数组中的子对象的选定属性发生更改时执行一些代码。我尝试通过all.subscribe()手动订阅all,但该代码仅在添加或删除项目时触发。我更新了代码,如下所示: all.subscribe(function () { ko.utils.arrayForEach(all(), function (item) { item.selected.subscribe(f

我有一个视图模型,其中包含一个对象的
可观察阵列
(名为“all”)。该对象的属性之一是所选的
可观察的
名称。我希望在数组中的子对象的选定属性发生更改时执行一些代码。我尝试通过
all.subscribe()
手动订阅
all
,但该代码仅在添加或删除项目时触发。我更新了代码,如下所示:

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

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

这几乎是正确的。可观察数组订阅仅适用于添加或删除项的情况,而不适用于修改项的情况。因此,如果您想订阅项目本身,那么您需要订阅项目本身:

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

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

()



我说“接近正确”,因为您将要删除所有旧订阅。当前,如果可观察数组以
[a,b]
开始,您将订阅
[a,b]
,但是如果添加
c
,您将有两个订阅
a
b
加上一个订阅
c

,如果我用
all([])
吹走旧数组,这会杀死所有订阅吗?用户实际上并不直接与这个集合交互,它就像一个复选框集合,没有动态更改。那么为什么它是一个可观察的数组呢?只需将其设置为一个普通数组,其中包含具有可观察属性的对象。只有通过调用
subscription.dipose()
,才能处理订阅,如图底部所示,因为它是通过AJAX调用填充的,我希望在AJAX调用返回时更新DOM;不要让它成为一个可观察的数组。