在我的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; ----
答案 0 :(得分:3)
以下是ko
文档的引用:
关键点:observableArray跟踪数组中的对象, 而不是那些对象的状态
简单地将一个对象放入一个observableArray并不能完全实现 该对象的属性本身是可观察的。当然可以 如果你愿意,可以观察这些属性,但那是一个 独立选择。 observableArray只跟踪它的对象 保持,并在添加或删除对象时通知侦听器。
因此,当您更改数组项时,不会通知knockout
的值valueHasMutated
。您可以使用self.show1 = function() {
self.test(self.test()+1);
self.collaps()[5] = true;
self.collaps.valueHasMutated();
};
功能手动通知订阅者:
{{1}}