3

この投稿から:

dependentObservableまず、 (aka )を最適化することをお勧めしますcomputed。オブザーバブルを読み取ると、Knockout は依存関係を依存関係マネージャーに登録します...

while ループで this.ParentList() にアクセスしていることを疑似コードで確認できます。これは、 registerDependency が 3000 回呼び出され、依存関係配列が 3000 回スキャンされることを意味します。

したがって、私の一番の提案は次のとおりです。ループの前にすべてのオブザーバブルを読み取ります。

この良いアドバイスを念頭に置いて、ここに私の質問があります:

observableko ユーティリティ メソッド (次のように) を使用して配列を反復処理するのは悪い形式ですか? [それが であると仮定しthis.mySelectListItems()ますobservableArray]:

self.selectedValuesCount = ko.computed(function () {
    var total = 0;
    ko.utils.arrayForEach(this.mySelectListItems(), function (item) {
        if (item.selected() === true) {
            total += 1;
        }
    });
    return total;
}, self);

つまり、次のことを行うことで何か得られるものはありますか?

self.selectedValuesCount = ko.computed(function () {
    var total = 0;
    var myArray = this.mySelectListItems();
    ko.utils.arrayForEach(myArray, function (item) {
        if (item.selected() === true) {
            total += 1;
        }
    });
    return total;
}, self);
4

2 に答える 2

4

いいえ、これらのコードのビットは完全に同等です。

引き渡すコールバックで同じオブザーバブルの値を何度も取得する場合にのみ、パフォーマンスが向上しますarrayForEachが、この場合、オブザーバブル配列の値は一度だけ取得されるため、その配列を追加の変数に入れたい理由を指摘してください。

于 2012-06-14T16:36:20.170 に答える
2

実際にパフォーマンスの低下を経験していますか? ループ用に監視可能な配列をアンラップすることは、非常に大きなデータ セットの場合は理にかなっていますが、数十個程度しかない場合は問題ありません。また、要素の並べ替えや削除など、監視可能な配列自体に変更を加える場合、最初にラップを解除すると、通常の配列を変更するだけであるため、データバインディング/サブスクリプションが更新されなくなります。

時期尚早の最適化は諸悪の根源であることを忘れないでください。

于 2012-06-14T16:38:24.903 に答える