observableArray替换时不明确的行为

时间:2012-10-23 11:02:31

标签: knockout.js

在我的ViewModel中,我有:

self.collaps = ko.observableArray([0,0,0,0,0,0,0]);

self.shouldShow = function(index) { return self.collaps()[index]; };

我的测试div:

<div data-bind="visible: shouldShow(5)">Shown!</div>

data-bind一个click: show按钮:

self.show = function() {
    // 1. Index 5 gets true after 2 clicks!!? But UI never updates!
    self.collaps()[5] = true;

    // 2. This is push-ing in true starting at index 0
    self.collaps.replace(self.collaps()[5], true);

    // 3. If I combine the two, I get the behavior I want, I think :)
    self.collaps()[5] = true;
    self.collaps.replace(self.collaps()[5], true);

};

这里发生了什么?这样做的正确方法是什么?

----&GT; JSFIDDLE for your pleasure!&lt; ----

1 个答案:

答案 0 :(得分:3)

以下是ko文档的引用:

  

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

     

简单地将一个对象放入一个observableArray并不能完全实现   该对象的属性本身是可观察的。当然可以   如果你愿意,可以观察这些属性,但那是一个   独立选择。 observableArray只跟踪它的对象   保持,并在添加或删除对象时通知侦听器。

因此,当您更改数组项时,不会通知knockout的值valueHasMutated。您可以使用self.show1 = function() { self.test(self.test()+1); self.collaps()[5] = true; self.collaps.valueHasMutated(); }; 功能手动通知订阅者:

{{1}}