3

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

JSFiddle中的完整示例

阅读此问题后,我了解到 KO 不会捕获成员值的变化。

我试图捕捉的变化是数组ready对象中的标志。groups使用传统的 KO 方式,我将定义如下计算

self.groups_status = ko.observableArray(
   $.map(self.groups(), function(g) { return g.ready();}));

this 将 observable 绑定到每个对象的就绪标志。问题是 KO 不跟踪值。

所以我尝试了以下

self.groups_status = ko.observableArray(
   $.grep(self.groups(), function(g) { return g.ready();}));

不同的是现在我只保留ready对象。数组正在改变。这也不起作用。

我需要能够注册self.groups_status并执行命令。

PS我在github上遇到了这个问题,但我无法让它工作。

4

2 回答 2

2

您正试图从错误的方向解决这个问题。

您需要的是使用 ako.computed而不是ko.observableArray.

然后,每当数组更改或任何项目的属性更改时,您的groups_status计算将触发其更改事件:groupsready

self.groups_status = ko.computed( function () {
    return $.grep(self.groups() , function(g) { return g.ready();})
});

演示JSFiddle

于 2013-10-16T11:57:03.587 回答
1

您的第一个示例创建了一个全新的可观察数组,该数组被初始化为一个布尔值数组(假设 ready() 是布尔值),因为 g.ready() 将在运行时返回组的状态。

您可以将代码更改为简单地返回实际的 observable,如下所示:

self.groups_status = ko.observableArray(
   $.map(self.groups(), function(g) { return g.ready;}));

数组中的值将被更新,然后在任何特定的“组”中更改就绪标志。但是,这不会拾取添加到 groups() 数组中的任何新项目。

$.grep会更糟,因为它将仅基于原始的 ready() 状态返回一组组实例,并且也不会改变。

如果您希望在添加项目时更新 groups_status 可观察对象,请参阅有关使用 computed() 函数而不是可观察数组的答案。

于 2013-10-16T12:19:37.120 回答