Javascript 淘汰赛JS,批量更新?

Javascript 淘汰赛JS,批量更新?,javascript,dom,mvvm,knockout.js,Javascript,Dom,Mvvm,Knockout.js,我有以下情况: 除了内容/标题等之外,observableArray还提供了一个项目列表。我想让每个项目都可以在视图中折叠 现在的问题是,我是否应该将此状态存储为每个项目的可观察状态:如果是,我如何实现一个触发器来有效地切换所有项目的打开/关闭-即最小化dom更新 ko.utils.arrayForEach似乎是一种方法,它是否仅在循环结束时触发视图刷新?有更好的办法吗 ko.utils.arrayForEach(this.items(), function(item) { ...

我有以下情况:

除了内容/标题等之外,observableArray还提供了一个项目列表。我想让每个项目都可以在视图中折叠

现在的问题是,我是否应该将此状态存储为每个项目的可观察状态:如果是,我如何实现一个触发器来有效地切换所有项目的打开/关闭-即最小化dom更新

ko.utils.arrayForEach似乎是一种方法,它是否仅在循环结束时触发视图刷新?有更好的办法吗

ko.utils.arrayForEach(this.items(), function(item) {
    ...
    item.close(true);
    ...
});
编辑:这是DOM中发生的事情(在敲除foreach循环中)



所以基本上我可以点击页面上的某个按钮,运行ko.utils.arrayForEach来切换所有项目。它是有效的,我只是不知道这是否是最好的方法(例如,只触发一次dom更新,而不是针对每个项目)。

我认为您需要实现一个过滤。基于数组创建新的筛选数组,并根据属性显示项

vm.filteredItems = ko.computed(function () {
    return ko.utils.arrayFilter(this.items(), function (fitem) {
        if ('open' == fitem.state()) {
            return true;
        }
        return false;
    });
}, vm);
在适当的事件中为每个项更改
状态
属性,并将
过滤器数据项
绑定到列表控件


查看更多详细信息

如果视图包含的元素取决于可见项目的数量,则应结合使用计算的可观察项。否则,
arrayForEach
版本就可以了,因为对于必要的DOM更新,没有什么可以“最小化”的(每个项目都需要显示/隐藏,您希望在那里优化什么?)。我认为我前面的例子让人困惑,现在更新了……您认为“最小化的DOM更新”会是什么样子?无论如何,仍然需要添加/删除或显示/隐藏所有元素。不知怎的,这必须一个接一个地发生。因此,没有什么需要优化的(只有当您有受每个项目更改影响的元素时)。我考虑的问题如下:-例如,当我关闭所有项目时,理想情况下,我希望模型通知视图一次,而不是N次。
vm.filteredItems = ko.computed(function () {
    return ko.utils.arrayFilter(this.items(), function (fitem) {
        if ('open' == fitem.state()) {
            return true;
        }
        return false;
    });
}, vm);