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;不要让它成为一个可观察的数组。