KnockoutJS,批量更新observableArray?

时间:2013-02-17 13:36:33

标签: javascript dom mvvm knockout.js

我有以下情况:

由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更新一次而不是每个项目。)

1 个答案:

答案 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了解详情