0

「X を試したことはありますか?」というような回答を探すのではなく、確かな回答を備えた知識のある情報源が必要です。

グラフを埋めるために使用している観察可能な配列があります。監視可能な配列には、ローカル キャッシュ内の Breeze.js から取得された最大 10,000 の POJO を含めることができます。最初に外に出てサーバーからデータを取得し、次にローカル キャッシュに対して呼び出しを行うと、データはほぼ瞬時に返されます。

次の呼び出しでは、指数関数的に遅くなります。返されるオブジェクトは、それぞれのオブザーバブルではなく、オブザーバブルを含んでいるわけでもありません。POJO を選択して Breeze クエリを実行しているためです。問題は、私が戻って同じデータセットを取得し続けるにつれて、それらがますます遅くなり続けることです。どういうわけか、監視可能な配列でメモリリークを作成していると思うようになりました。

私からしてみれば -

<h1>There are <span data-bind="text: chartData().length"></span> chart items</h1>

私のビューモデルでは -

var chartData = ko.computed(function () {
    var myArray = ko.observableArray();
    var params = { xmin: xMin(), xmax: xMax() };
    if (!initialized) { return myArray(); }
    datacontext.getData(myArray, params.xmin, params.xmax false);
    return myArray();
}).extend({ throttle: 2000 });

クエリが実行されている datacontext.js ファイル内 -

if (!forceRemote) {
    var thisData = manager.executeQueryLocally(query);
    myObservable([]);
    var myArray = myObservable();
    ko.utils.arrayPushAll(myArray, thisData);
    return myObservable.valueHasMutated();
}

SO.com の別の質問の推奨事項に基づいて、arrayPushAll と値の変更を試みましたが、myObservable([]) を設定してから thisData に等しく設定するよりも速くないようです。

データセットが大きいため、再計算をできるだけ短くしたいと考えています。

xmin と xmax を params として設定している理由は、計算結果を 2 つのオブザーバブルに依存させるためです...

4

2 に答える 2

3

私自身、特に IE8 では、フィルタリング時に Knockout が遅いことがわかりました。残念ながら、これは私にとってまだサポートされているブラウザーです :-( 問題は、複雑な html テンプレートを含む大規模なコレクションをフィルタリングしていたことです。

CSSの「display」プロパティを使用してこれを解決しました。コレクション内の要素ごとに可視の Observable を追加し、次のデータ バインドを追加しました。( hidden は display:none; の css クラスです)

data-bind="css:{'hidden':visible()===false}"

その後、コレクションをループして、必要に応じてプロパティを設定するだけです。これは私の場合に大きな違いをもたらしました。

于 2014-02-05T17:18:11.490 に答える