2012-05-25 50 views
1

我有一個模型的Backbone集合,它在頁面加載時進入的數據與在提取時導入的數據不同。Backbone.js:使用不同的數據更新集合

例如,即將在頁面加載的屬性是:

[{ name: 'cat', color: 'yellow' }, 
{ name: 'dog', color: 'brown' }, 
{ name: 'fish', color: 'orange' }] 

然後,取()(或者在頁面的生命,數據看起來像另外的服務器更新:

[{ name: 'cat', current: 5, total: 100 }, 
{ name: 'dog', current: 6, total: 50 }, 
{ name: 'fish', current:7, total: 25 }] 

我怎樣才能用新的數據更新的骨幹收集,同時保留舊的數據?ID不從服務器分配(名稱保證是唯一的)。

+0

定義「保留」。你的意思是將舊數據保存到一些變量中?或者更多的保留舊的和新的數據在同一個集合實例中? –

+0

後者(保留舊數據和新數據都在同一個集合實例中) – Muers

+1

那麼內建的'fetch()'不做你想做的事情? [來自文檔](http://documentcloud.github.com/backbone/#Collection-fetch):*如果您想將傳入模型添加到當前集合中,而不是替換集合的內容,請將'{ add:true}'作爲獲取的選項。* –

回答

0

我結束了布萊恩克與此。這將更新存在的模型的屬性,同時還刪除未添加的模型並添加新的模型。

Backbone.Collection.prototype.update = function(col_in){ 
    var self = this, 
     new_models = []; 

    _(col_in).each(function(mod_in) { 
    var new_model = self._prepareModel(mod_in), 
     mod = self.get(new_model.id); 
    if (mod) { 
     new_models.push(mod.set(mod_in, {silent:true})); 
    } else { 
     new_models.push(mod_in); 
    } 
    }); 

    this.reset(new_models); 
}; 

注意使用_prepareModel這很重要,這樣的模型可以通過任何「ID」屬性在骨幹示範對象使用來識別。