1

我有以下情况:

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

4

1 回答 1

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到您的列表控件。

查看下一个示例以获取更多详细信息

于 2013-02-17T14:02:25.477 回答