2011-11-02 119 views
7

如何一次性將所有值添加到observableArray?在我的情況下,在循環中添加值非常慢。這裏是jsfiddle的例子。 jsfiddleknockout observableArray性能

+0

我對項目添加到陣列的性能問題,你應該使用一個音符ARRAY_NAME [array_name.length-1] =您的項目;這條線比推送方法快 – Marwan

+0

差異真大嗎? – Neir0

+0

我覺得是這樣看這篇文章 http://www.scottlogic.co.uk/2010/10/javascript-array-performance/ 和對不起,我誤以爲它的array_name [array_name.length] =您的項目 – Marwan

回答

7

既然你清除出整個觀察到的數組,你可以做到這一點的一個方法是:

var viewModel = { 
    name: "base", 
    addingValue:new ko.observable(), 
    someArr: new ko.observableArray(["123","432","sdafasd","xrere"]), 
    add: function() 
    { 
     this.someArr.push(this.addingValue()); 
    }, 
    updateSomeArr:function() 
    { 
     var temp = []; 

     for(var i=0;i<5;i++) 
     { 
      temp.push("555565"); 
     } 

     this.someArr(temp); 
    } 
} 
+0

哈哈很簡單。謝謝 – Neir0

+0

沒問題。還有一種方法可以「關閉」觀察行爲,更新模型,然後再打開它 - 但我似乎無法找到它的頁面。 –

+0

using array_name [array_name.length-1] = item;比推方法更快 – Marwan

3

已經有一個選定的答案,但我認爲下面會有所幫助。你可以通過執行您觀察到的陣列,以獲得潛在的數組實現禁用觀察行爲:

​​

然後,您可以將項目添加到underlyingArray沒有發射過someArr事件。一旦你完成添加項目,請致電:

viewModel.someArr.valueHasMutated(); 

這將導致觸發事件,通知所有觀測依賴viewModel.someArr()。

17
var myArray = ko.observableArray([]); 
var valuesToInsert = [1,2,3]; 
myArray.push.apply(myArray, valuesToInsert); 

就是這樣

+0

想知道爲什麼答案是downvoted。 – AGS

+0

仍然不明白爲什麼最優雅和正確的答案是downvoted :)。將不勝感激的解釋。 – AGS

+1

這實際上是將所有項目一次推送到一個數組的最佳方法。這是一篇關於它的用法的文章http://www.knockmeout.net/2012/04/knockoutjs-performance-gotcha.html –

相關問題