2014-02-26 64 views
0

我從服務器獲取一個數組,該數組可以包含數組中的0..n個元素。然後我添加到陣列我本地使用數據綁定(基本上緩存數據在客戶端)。如果做這種方式databiding工作沒有任何問題:AngularJs將數組中的多個值從數組推送到另一個,並使用數據綁定更新

for (var i = 0 ; i < data.Result.length ; i++) { 
    scope.cachedData.push(data.Result[i]); 
} 

含義 - 視圖刷新,一切正常。但是,當我嘗試:scope.cachedData.concat(data.Result);它不會工作。這是爲什麼?

+1

也許是因爲concat不會修改相同的數組,但會返回一個新的數組... try * scope.cachedData = scope.cachedData.concat(data.Result)' – doodeec

+0

@doodeec - 你是完全正確的。從性能的角度來看,這個新任務會比.push更糟糕嗎?是否有可能做一些.pushAll()方法,而不是在做? – kape123

+2

我認爲push可以更快,因爲它不會改變原始數組中的現有引用,它只是增加了一個新的引用...所以如果你在'ng-repeat'中使用數組,它會更快地更新,元素將會更新時不閃爍 – doodeec

回答

4

如果您要在不破壞引用推單指令使用apply一切scope.cachedData

Array.prototype.push.apply(scope.cachedData, data.Result); 

而且,我知道這是一個有點題外話,但如果你想要在特定索引處插入您可以使用的spliceapply

// I definitely want to prepend to my array here 
var insertionIndex = 0, 
// we don't want to delete any elements here from insertionIndex 
    deleteCount = 0; 
// Because we use apply the second argument is an array 
// and because splice signature is (startIndex, noOfElementsToDelete, elementsToInsert) 
// we need to build it 
Array.prototype.splice.apply(scope.cachedData, [insertionIndex, deleteCount].concat(data.Result)); 

想象一下您的數組scope.cachedData = [3,4];data.Result = [1,2];,其中scope.cachedData以上的代碼將變爲[1,2,3,4]

+1

不錯,我肯定會開始使用 – doodeec

相關問題