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 に答える