2

重複の可能性:
Knockout.js は準大規模なデータセットでは非常に遅い

モデルに次のイベントがありますが、レコードが数個しかない場合は正常に動作しますが、数十個のレコードを取得すると、スクリプトの実行が遅すぎると IE が訴えます。

    self.getTrades = function () {

    $.ajax({

        type: "GET",
        cache: false,
        url: "/_vti_bin/DBOrderService/DBOrderService.svc/GetTradesByDateSource?format=json&traddate=" + self.selectedDate() + "&source=" + self.selectedSource(),
        success: function (data, textStatus, jqXHR) {
            if (data.requeststatus.code === 1) {
                var statusId = SP.UI.Status.addStatus(data.requeststatus.message);
                SP.UI.Status.setStatusPriColor(statusId, 'red');
                return;
            }
           debugger;
           ko.mapping.fromJS({ trades: data.trades }, mappings, self); //too slow, events are firing as items are added
            self.selectedTrade(null);
        },
        error: ajaxError
    });
};

マッピングが追加された行ごとに変更通知を発行しているためだと思うので、新しい行を「一括」でモデルにコピーしたいと思います。

私は試した

 var temptrades = ko.mapping.fromJS(data.trades, mappings);
 self.trades=temptrades();

self.trades(temtrades);

self.trades(temptrades();

しかし、それらはすべて私のモデルを壊すだけです。ko.mapping によって作成された監視可能な配列を一度にモデルにコピーする正しい方法は何ですか。最後までイベントの発火を防ぐ ko.mapping のオプションはありますか?

4

1 に答える 1

5
   ko.mapping.fromJS({ trades: data.trades }, mappings, self); //too slow, events are firing as items are added

あなたは正確に正しいです。アイテムが追加されると、イベントが発生します

参照してください:Knockout.jsパフォーマンスの落とし穴#2-observableArraysの操作

より良いパターンは、基になる配列への参照を取得し、それにプッシュしてから、.valueHasMutated()を呼び出すことです。現在、サブスクライバーは、アレイが変更されたことを示す通知を1つだけ受け取ります。

また、この答えを見てください。

[マッピング]と[監視可能な配列の更新]を2つのステップに分割すると、問題が解決する場合があります。

于 2012-10-12T16:29:09.140 に答える