在子集

时间:2017-12-22 09:36:43

标签: knockout.js

我正在构建一个菜单,我有一个category对象,它有一个menuitem s的可观察数组。

我在category创建了一个可观察的属性true,当可观察数组中的至少一个menuitem具有active属性{{1} }}

(因此true有一个名为category的计算属性,当可观察的menuitems数组中的至少一个项具有active时,该属性必须为true属性设置为active

true上的active属性是可观察的menuitem

现在看来,当它的子(菜单)项上的属性发生更改时,类别上的计算属性不会更改。

我可以看到子(菜单)项的值发生变化,但类别上的计算属性没有(我此时在计算属性中执行控制台日志,而我只是不记录计算属性得到评估)。

这是设计,还是我在这里做错了什么......

PS我们使用的是KO的2.3版本

1 个答案:

答案 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;
&#13;
&#13;