我正在构建一个菜单,我有一个category
对象,它有一个menuitem
s的可观察数组。
我在category
创建了一个可观察的属性true
,当可观察数组中的至少一个menuitem
具有active
属性{{1} }}
(因此true
有一个名为category
的计算属性,当可观察的menuitems数组中的至少一个项具有active
时,该属性必须为true
属性设置为active
)
true
上的active
属性是可观察的menuitem
。
现在看来,当它的子(菜单)项上的属性发生更改时,类别上的计算属性不会更改。
我可以看到子(菜单)项的值发生变化,但类别上的计算属性没有(我此时在计算属性中执行控制台日志,而我只是不记录计算属性得到评估)。
这是设计,还是我在这里做错了什么......
PS我们使用的是KO的2.3版本
答案 0 :(得分:1)
或者我在这里做错了什么......
如果您不显示任何代码,很难判断,但 似乎是这样。
这是您描述的行为的实现,它完全符合您的预期。由于您使用的是淘汰赛2.3,因此每次计算重新评估时,您都会看到订阅触发器。请注意,在更高版本的淘汰赛中,只有在值实际发生变化时才会触发。
var Category = function() {
this.menuItems = ko.observableArray([
{ active: ko.observable(false) },
{ active: ko.observable(false) },
{ active: ko.observable(true) },
{ active: ko.observable(false) }
]);
this.active = ko.computed(function() {
return this.menuItems().some(function(subMenu) {
return subMenu.active();
});
}, this);
this.active.subscribe(console.log);
};
ko.applyBindings(new Category());

<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/2.3.0/knockout-min.js"></script>
<input type="checkbox" disabled data-bind="checked: active">Parent active
<ul data-bind="foreach: menuItems">
<li>
<label>(active <input type="checkbox" data-bind="checked: active">)</label>
<span data-bind="text: 'Menu ' + $index()"></span>
</li>
</ul>
&#13;