2

不思議なことに、現在の「foreach」バインディングが配列を反復するのと同じように、リンクリストを反復する「foreach」バインディングを作成するにはどうすればよいでしょうか。

いじくり回すためのjsFiddleを作成しました。

リンクリストは、Knockout.jsで使用するのに便利なイディオムになると思います。特に、正しく実行された場合、DOMは追加/削除されている要素に対してのみ更新され(つまり、要素が追加/削除されたときにリスト全体が更新されない)、リストの中央への追加/削除は次のような複雑さを持ちます。 O(1)、対配列のO(n)。

4

2 に答える 2

1

配列ベースの foreach はすでに非常にパフォーマンスが優れています。DOM 要素は必要に応じてのみ追加/削除されます。もちろん、配列全体が変更のためにスキャンされますが、それは非常に高速です (ko には配列の粗い変更信号しかありません)。使用される距離アルゴリズムにより、ランダムな挿入または削除が高速になります。

于 2012-08-20T11:26:17.057 に答える
0

これは良いアイデアですが、残念ながらそれは不可能だと思います。

リストの先頭のオブザーバブルと、すべての要素の「次の」オブザーバブルをサブスクライブする必要があります。

問題は、オブザーバブルのどれが変更をトリガーしたかがわからない限り、何の利点も得られないことです。リストの途中で何かを編集する場合、全体のポイントは、構造全体を反復することなく、foreach バインディングが DOM のその部分を更新できる必要があるということです。バインディングは現在、これを許可していません。バインディングが複数のオブザーバブルにサブスクライブしているupdate場合、それらのいずれかが変更された場合、それらのどれが変更されたかを知らなくても、そのメソッドが呼び出されます。

また、これが機能したとしても、余分な ko.observable() 構造とサブスクリプションはすべて、かなりのオーバーヘッドになります。別の配列要素を持つだけでなく、3 つのオブザーバブル。

DOM への不必要な変更を避けるために、新しい構造を古い構造と比較して、関連する変更を加えることができますが、とにかく配列を使用する場合にこれを行うことができます (組み込みの foreach バインディングがこの最適化を行うとは思いません)。

于 2012-08-13T13:08:26.323 に答える