Knockout.js - 注册更改observableArray

时间:2013-10-16 11:46:41

标签: javascript knockout.js

我正在尝试捕获可观察数组更改的事件。

JSFiddle

中的完整示例

阅读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,但我无法使其正常工作。

2 个答案:

答案 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()函数而不是可观察数组的答案。