我正在尝试捕获可观察数组更改的事件。
中的完整示例阅读this question后,我了解到KO并未捕获成员值的变化。
我想要捕获的更改是ready
数组对象中的groups
标志。
使用传统的KO方式,我将定义一个计算如下
self.groups_status = ko.observableArray(
$.map(self.groups(), function(g) { return g.ready();}));
这会将observable绑定到每个对象的ready标志。问题是KO没有跟踪价值观。
所以我尝试了以下
self.groups_status = ko.observableArray(
$.grep(self.groups(), function(g) { return g.ready();}));
差异现在我只保留ready
个对象。数组正在改变。这也不起作用。
我需要能够注册到self.groups_status
并执行命令。
P.S我在github上遇到this issue,但我无法使其正常工作。
答案 0 :(得分:2)
你正试图从错误的方向解决这个问题。
您需要的是使用ko.computed
代替ko.observableArray
。
然后,只要groups_status
数组发生更改或任何项目的groups
属性更改,ready
computed就会触发其更改事件:
self.groups_status = ko.computed( function () {
return $.grep(self.groups() , function(g) { return g.ready();})
});
演示JSFiddle。
答案 1 :(得分:1)
第一个示例创建一个全新的可观察数组,该数组初始化为一个布尔值数组(假设ready()为boolean),因为g.ready()将在运行时返回组的状态。
您可以将代码更改为简单返回实际的observable,如下所示:
self.groups_status = ko.observableArray(
$.map(self.groups(), function(g) { return g.ready;}));
将更新数组中的值,然后在任何特定的“组”中更改就绪标志。但是,这不会获取添加到groups()数组中的任何新项目。
$.grep
会更糟糕,因为它只会根据原来的ready()状态返回一组组实例,并且也不会改变。
如果希望groups_status observable在添加项目时更新,请参阅有关使用computed()函数而不是可观察数组的答案。