0

在我的 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);

};

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

----> JSFIDDLE 为您服务!<----

4

1 回答 1

3

这是ko文档中的引用:

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

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

因此,当您更改数组项的值时knockout,不会收到通知。您可以使用valueHasMutated函数手动通知订阅者:

self.show1 = function() {
    self.test(self.test()+1);

    self.collaps()[5] = true;
    self.collaps.valueHasMutated();
};
于 2012-10-23T11:18:13.487 回答