2012-12-21 46 views
4

我有一個「資產」骨幹模型有一個自定義屬性稱爲「選定」。它的自定義,它不是服務器端對象的一部分。我用來表示用戶當前選擇的資產列表中的哪一個。我怎樣才能堅持通過集合獲取自定義屬性

var Asset = Backbone.Model.extend({ 
    defaults: { 
     selected: false 
    }, 

    idAttribute: "AssetId" 
}); 

此模型是我定期從服務器獲取任何更改的骨幹集合的一部分。

我遇到的問題是,每次我獲取集合時,集合都會進行重置(我可以通過偵聽重置事件來判斷),因此所選屬性的值將被數據刪除來自ajax請求。

backbone.js文檔似乎暗示有智能合併可以解決這個問題。我相信我在我的獲取方法

allAssets.fetch({ update: true ,cache: false}); 

這樣做的,我還設置了「idAttribute」字段中模式,使進入的對象的ID可與集合中的對象進行比較。

我已經解決了這一問題的方法是在我的收藏對象

parse: function (response) { 
    // ensure that the value of the "selected" for any of the models 
    // is persisted into the model in the new collection 
    this.each(function(ass) { 
     if (ass.get("selected")) { 
      var newSelectedAsset = _.find(response, function(num) { return num.AssetId == ass.get("AssetId"); }); 
      newSelectedAsset.selected = true; 
     } 
    }); 
    return response; 
} 

寫我自己的解析方法有沒有更好的方式來做到這一點?

回答

1

Collection.update(在Backbone 0.9.9中引入)的確嘗試合併現有模型,但通過將新模型中的所有集合屬性合併到舊模型中來實現。如果你檢查Backbone source code,你會看到

if (existing || this._byCid[model.cid]) { 
    if (options && options.merge && existing) { 
     existing.set(model.attributes, options); 
     needsSort = sort; 
    } 
    models.splice(i, 1); 
    continue; 
} 

的所有屬性,包括默認值,設置,這就是爲什麼你選擇的屬性重新設置爲false。刪除所選的默認值將按預期工作:比較http://jsfiddle.net/nikoshr/s5ZXN/http://jsfiddle.net/nikoshr/s5ZXN/3/

即是說,我不會依賴模型屬性來存儲我的應用程序狀態,我寧願將其移動到其他位置的控制器。