2012-10-12 117 views
2

可能重複:
Knockout.js incredibly slow under semi-large datasets淘汰賽映射性能問題

我在我的模型下面的事件,如果我只有記錄了一把,但如果我得到一對夫婦的正常工作十幾個記錄,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(); 

但他們都只是breajk我的模型。 將ko.mapping創建的可觀察數組一次性複製到我的模型中的正確方法是什麼? ko.mapping中是否有選項可以防止觸發事件發生?

+2

您應該檢查過去的問題以獲得可接受的答案。 –

回答

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

你完全正確。事件被作爲射擊項目添加

請參閱:Knockout.js Performance Gotcha #2 - Manipulating observableArrays

一個更好的方式是去我們的基本數組的引用,推到它,然後調用.valueHasMutated()。現在,我們的用戶只會收到一個通知,表明陣列已經改變。

另外,請看this answer

將[映射]和[可觀察數組更新]分爲兩步可能會有所幫助。