7

Knockout.js の使い方を学んでいます。observableArray のコンテンツを反転して表示したいので、Knockout の逆関数を次のように使用します。

   <ul  data-bind="foreach: anObservableArray.reverse()" >...</ul>

しかし、それは機能せず、エラーは発生しません。これを試すと:

<ul  data-bind="foreach: anObservableArray.slice(0).reverse()" >...</ul>

期待どおりに動作します。私の質問は、リバース関数が既に反転した配列を返しているのに、なぜ配列全体をコピーする必要があるのですか?

4

3 に答える 3

7

呼び出すreverseと、実際には配列がその場で逆になります (そしてそれが返されます)。そのため、複数回逆になるという問題が発生する可能性があります。

たとえば、次のような 2 つのブロックがあるとします。

<ul  data-bind="foreach: anObservableArray.reverse()" >...</ul>
<ul  data-bind="foreach: anObservableArray.reverse()" >...</ul>

1 つ目は逆になり、2 つ目は元の順序に戻ります。

特に配列にアイテムを追加および削除する場合は、コピーを逆にすることをお勧めします。

于 2013-01-18T03:57:06.577 に答える
3

この質問の検索からこれを取得しました。配列をコピーする必要がある理由、

「knockout.js 2.2 では、配列ミューテーション関数が監視可能な配列への依存関係を作成しないようにするための変更がありました。一般に、計算された配列の逆バージョンを返す場合は、元の配列ではなく逆の配列で使用します。コピー. の代わりに self.anObservableArray.reverse()、実行 self.anObservableArray.slice(0).reverse() 例:http://jsfiddle.net/mbest/3QHM7/1/

つまり、基本的には、監視可能な配列への依存関係を作成しないようにすることです。

于 2014-09-09T06:21:37.250 に答える
1

reverse() は、コピー配列を返す代わりにソース配列に影響を与え、「foreach」バインディングでノックアウトを 2 回呼び出すため、最終結果で同じ配列が得られます。

次のコードでテストできます。

<ul  data-bind="foreach: alert(anObservableArray.reverse())" >...</ul>
于 2013-12-31T07:35:23.670 に答える