我有以下情况:
由observableArray表示的项目列表,除了内容/标题等。我想让它们中的每一个都可以折叠。
现在问题就变成了我应该将这个状态存储为每个项目的可观察性:如果是这样的话我如何实现一个触发器来切换所有项目的开放/关闭 - 即。最小化dom更新。
ko.utils.arrayForEach 似乎是要走的路,是否只在循环结束时触发视图刷新?有更好的方法吗?
ko.utils.arrayForEach(this.items(), function(item) {
...
item.close(true);
...
});
编辑:这就是DOM中发生的事情(在淘汰赛的foreach循环中)
<div class="item">
<!-- ko 'if': !close() -->
<div class="article" data-bind="html: article"></div>
<!-- /ko -->
</div>
所以基本上我可以点击这个页面上的某个按钮,它运行ko.utils.arrayForEach来切换所有项目。它工作,我只是不知道它是否是最好的方式(例如,只触发dom更新一次而不是每个项目。)
答案 0 :(得分:0)
在我看来,你需要实现过滤。根据您的数组创建新的过滤数组,并根据您的属性显示项目。
vm.filteredItems = ko.computed(function () {
return ko.utils.arrayFilter(this.items(), function (fitem) {
if ('open' == fitem.state()) {
return true;
}
return false;
});
}, vm);
在每个项目的相应事件中更改state
属性,并将filteredItems
绑定到列表控件。
查看next example了解详情