2012-03-29 17 views
3

我遇到了與IE8的挖空映射插件的問題。我們的情況是,我們發送了所有可能顯示給客戶的記錄。然後我們處理客戶端的所有分頁和過濾以獲得響應式系統。用敲除貼圖插件節流

目前,我們正在發送一個250條記錄的列表,以通過jQuery ajax在基於jQuery模板的網格中顯示。當我們調用ko.mapping.fromJS(而不是fromJSON函數)映射對象時,我們得到了IE8的「腳本花費太長時間」的消息。在FF和Chrome中不會發生這種情況,因爲它們的Java腳本執行速度更快。

是否有直接的方法來限制映射?這是一個長期的問題,因爲我們可能會遇到將近1000條記錄發送給客戶的情況。

回答

2

IE是一個頑皮的小.....不是它。

當與javascript進行數據綁定,如果將要有一個重要的UI更新,我做了類似下面的事情。

function ajaxCallback(listOfDataItems){ 

    var addToUiFunction = function(item){ 
    // add it to the ko.observable array which is data bound to the UI 
    myDataBoundArray.push(item); 
    }; 

    for (var i = 0, arrayLength = listOfDataItems.length; i < arrayLength; i++){ 
    var temp = listOfDataItems[i]; 

    //create an immediately executing function to close around 
    //the item that returns a function to call at a later date. 
    var tempFunction = (function(){ 
     var item = temp; 
     return function() { addToUiFunction(item) }; 
    })(); 

    setTimeout(tempFunction, 0); 

    } 
} 

這裏發生的事情是我只添加一個項目到UI一次。我使用延遲爲0的setTimeout推遲單個添加的執行,直到當前調用完成。這意味着非常短的工作單元不會超時瀏覽器。

p.s.該代碼有點狡猾,它只是試圖說明一個觀點。

+0

您應該可以批量執行您的項目,而不是更新單個項目,因爲每次您強制DOM執行重新佈局時也是如此。 – 2012-12-13 04:13:15

0

我們也有同樣的問題。我們的視圖模型有太多的計算可觀察量,導致腳本運行速度更慢。刪除不必要的subscribles可能會讓您免於此問題。

0

我知道這不是一個理想的答案,但如果你的情況允許,你總是可以不映射內部項目。防爆。如果您的ajax調用返回1000人,並且您希望您的用戶界面更新並顯示所有這些人,則可以讓您的視圖模型具有原始人員js對象的observableArray(而不是他們的ko映射等效項)。如果您添加或刪除observableArray中的項目,它將在用戶界面上正確顯示,但如果需要訂閱每個人的所有屬性上的所有屬性更改事件,則無法幫助您。

通常當我拉這很多項目,它是爲了報告,所以我不需要編輯項目本身,但確實需要根據過濾標準添加/刪除行中的行。