2015-10-23 160 views
0

我有一個定義爲ko.observableArray([])的值,並使用ko.mapping.fromJS將數據從ajax追加到它。但是,當我再次使用ko.mapping.fromJS時,從ajax調用的新數據獲取將替換self.SampleArray,而不是追加新數據。我想保留以前的數據。它怎麼能做到?保留原始值與ko.mapping.fromJS

function ViewModel() { 
 
    var self = this; 
 
    
 
    self.SampleArray = ko.observableArray([]); 
 
    
 
    $.ajax({ 
 
    .. 
 
    .. 
 
    success: function() {  
 
     ko.mapping.fromJS(data, {}, self.sampleArray()); 
 
    } 
 
    }) 
 
}

回答

2

嘗試將其推入observableArray,而取代它

視圖模型:的push.apply

function ViewModel() { 
    var self = this; 
    self.sampleArray = ko.observableArray([{ 
     'Hours': 0.5 
    }]) 
    setTimeout(function() { 
     alert('Mock of ajax call') 
     var newData = ko.mapping.fromJS(data1)(); 
     self.sampleArray.push.apply(self.sampleArray,newData) 
    }, 2000); 
} 
ko.applyBindings(new ViewModel()) 

優於傳統循環語句:

如果陣列/集合了多個項目,如果你添加 (的Array.push(項目)一個接一個,則用戶將針對每一個推 通知/添加操作。然後用戶界面將有該號碼 刷新。這會傷害UI頁面的表現。

但是,如果您使用array.push.appy,那麼您仍然可以添加多個 項目,但訂閱者只會收到一次通知。

這是 array.push.apply函數的區別和優點/用法。

樣品工作撥弄here

樣品正在與utils.forEach here

+0

什麼是使用ko.utils.arrayForEach超過$。每次的優勢小提琴? – desmondlee

+0

@desmondlee'arrayForEach'來自knockout utility lib,其中'.each'是一個jQuery版本。 '.each'需要jquery庫的功能,因爲它是一個非ko函數。兩者都做同樣的事情。 –

+0

@desmondlee使用'push.apply'優化代碼檢查更新歡呼 –