在子集合中的项目内容上创建计算属性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在子集合中的项目内容上创建计算属性相关的知识,希望对你有一定的参考价值。

我正在建立一个菜单,我有一个category对象,它有一个可观察的menuitems阵列。

我在category上创建了一个可观察的属性true,当可观察数组中的至少一个menuitems具有activetrue属性时。

(所以category有一个名为active的计算属性,当可观察的menuitems数组中的至少一个项目的true属性设置为active时,必须是true

active上的menuitem财产是一个可观察的boolean

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

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

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

PS我们使用的是KO版本2.3

答案

或者我在这里做错了什么......

如果你没有显示任何代码,这很难分辨,但看起来确实如此。

这是您描述的行为的实现,它完全符合您的预期。由于您使用的是淘汰赛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>

以上是关于在子集合中的项目内容上创建计算属性的主要内容,如果未能解决你的问题,请参考以下文章

Firestore 的子集合中每秒可以创建多少个文档?

有没有办法获取子集合中的所有文档(Firestore)

Flutter : 检查子集合中是不是有特定的数据

如何根据子集合中的值选择对象?

使用 CollectionGroupQuery 的子集合中的 Firestore 写入限制

如何从所有文档的子集合中检索所有数据