2016-03-29 11 views
3

Knockout.jsを新しい3.4.0バージョンに広範囲に依存する複雑なWebアプリケーションを移行して、コンポーネントを実装できるようにして、ノックアウトドキュメント読み取ることで、新たなdeferUpdatesオプションの提供、:遅延更新を使用してノックアウト3.4.0 deferUpdatesと再評価数

は、計算された観測とバインディング は、その依存関係が安定しているだけで後に更新されることが保証されます。

驚くべきことに、以前のように従属オブザーバブルが以前よりも何度も再評価され、以前より多くのUI再描画が発生する状況があります。

これは古いKOバージョンで一つだけ再評価につながるobservableArraysのための古典的な最適化の一例であり、新しい3.4.0 なしdeferUpdatesでオン:設定することで、

this.items = ko.observableArray(); 
this.addNewData = function() { 
    var items = ko.utils.arrayMap(Items, function(item) { 
    return new Item(item.name, item.priority); 
    }); 
    //take advantage of push accepting variable arguments 
    self.items.push.apply(self.items, items); 
}; 
this.addNewData(); 

this.items = ko.observableArray(); 

ko.options.deferUpdates = true; 

は2つの再評価、observableArrayの作成に1つあります

と、データが提供されたときの2番目はaddNewData()を呼び出すことによって発生します。

フィドル:http://jsfiddle.net/kkrgjbsr/

は代わりに、ちょうどであることが起こる何をより詳細に説明するため、observableArray初期設定に従うこと、それは私のために良いだろうと、ただ一つだけ、単一の再評価を引き起こす:

this.items = ko.observableArray([ 
    new Item(Items[0]), 
    new Item(Items[1]), 
    ...and so on 
]); 

でした誰かが、絶対に必要とする私のアプリケーションの一部があり、同時にこれらの不要な再評価を避けるため、deferUpdatesのパフォーマンス改善をいかに保つかを親切に説明してください。

ところで、deferUpdatesをオンにすることによって再評価数が増加するアプリケーション全体を追跡する方法はありますか?事前にみんなが

ますのでご注意ください

ありがとう:

  • 私はレート制限エクステンダーを使用しない、また、これは常に提供する場合、私はわからないよう、一定の期間を指定しますただ一つの再評価。
  • 私はそれらの何百ものを持っているので、deferredUpdatesで個別に各単一観測可能を延長しないことを好むだろう、とのコードが
+1

私が理解していない点は、作成中にthis.items = ko.observableArray();が定義されているので、どのように違いがあるのか​​分かりません。この問題を示す実行可能なコードのサンプルは、文脈上非常に役立ちます。 – Tomalak

+0

こんにちはtomalak、私は問題を隔離するために数時間を費やしました。そして私は悲しいことに、それがどこにあるのかを知るために驚いていました。:-)しかし、私のフィドルを見れば、dependantComputedはコンポーネントのスイッチとして考えるべきです。 2回変更すると、2つのコンポーネントの再描画が行われます。私は今より明確になることを願っています。 THX – deblocker

+0

*注釈*、[複数のアイテムを一度にプッシュする際のこの質問](http://stackoverflow.com/q/23606541/419956)も興味深いかもしれません。 – Jeroen

答えて

2

OKを中断します。ここで、iは正確に予見することはできません、それは私が見つけたものです:

ko.options.deferUpdates = trueは、viewmodelの初期化中にのみこの1つ以上の再評価を作成します。

単に効用関数arrayMap使用し、observableArrayコンストラクタにデータを渡すために - そこには面倒:私の特別な場合には

this.items = ko.observableArray(ko.utils.arrayMap(Items, function(item) { 
    return new Item(item.name, item.priority); 
})); 

を、増加した再評価数の不要な副作用を認識することは困難であったためデータだけでなくUIの再描画にも影響し、予期せぬパフォーマンスの低下につながりました。

さらに、私は新しい3.4.0のノックアウトバージョンで「リニア評価した計算されたオブザーバブル」をテストし、deferUpdatesをオンにしました - 「Add New Bad」ボタンでも1回の再評価回数しか表示されません)。

今、私はいつも新しいオプションdeferUpdatesをオンにしています。これは華やかで不可欠なパフォーマンスの向上であり、古いKOバージョンで必要とされるほとんどの最適化はもはや必要ありません - 唯一の厄介なことは、特別な状況では、これらの最適化の一部はである必要があります。を削除してください。

+0

参考までに、この問題は少し異なる文脈で報告されています:https://github.com/ノックアウト/ノックアウト/プル/ 2163。修正は、次のリリースで行う必要があります。 –