2013-06-26 43 views
3

目前我有一個服務器調用,返回兩個對象和我用來設置集合的對象之一。 (我每10秒輪詢一次,很快就會使用socket.io)。Backbone.js集導致已經在集合中的模型再次「初始化」

我注意到我的模型初始化函數每次使用set對象時都會被調用。我認爲這套設備很聰明,只添加/改變了attr或刪除了模型,對於那些沒有改變的模型,什麼都不做。

// All Orders Collection 
var AllOrders = Backbone.Collection.extend({ 
    model: Order, 
    url: '/venues/orders' 
}); 


var Order = Backbone.DeepModel.extend({ 
    idAttribute: 'orderid', 
    url: '/venues/orders', 


    initialize : function(){ 
     // this is called everytime i use set even if model is in collection 
     // do stuff 
    } 
}) 


***************** 
app.allOrders.set(app.getOrders.get('orders')); 

回答

2

如果你看一下骨幹源,

當合並模型到一個集合的_prepareModel方法合併它創建從屬性傳遞一個新的模式之前調用。

這裏是set code

if (!(model = this._prepareModel(attrs = models[i], options))) continue; 

    // If a duplicate is found, prevent it from being added and 
    // optionally merge it into the existing model. 
    if (existing = this.get(model)) { 
     if (remove) modelMap[existing.cid] = true; 
     if (merge) { 
     attrs = attrs === model ? model.attributes : options._attrs; 
     existing.set(attrs, options); 
     if (sortable && !sort && existing.hasChanged(sortAttr)) sort = true; 
     } 

會發生什麼時,

  • 一個新的模式是從屬性您通過創建
  • 集合中查詢現有模型用與新的ID相同。
  • 如果合併選項是true它將新屬性推送到現有模型。
0

這取決於您如何編寫客戶端和服務。默認情況下,GET /場地/訂單將返回整個訂單清單。如果您想要獲取更改,則只需爲保留當前訂單的訂單集合編寫自定義同步,並僅從服務器獲取更改(例如,您發送當前ID,或者發送上次呼叫的時間戳)。順便說一句。初始化將由每個獲取的模型調用,因爲它們是從json和collection.set創建的,無法將json對象與骨幹模型進行比較,它只能比較骨幹模型和骨幹模型。

可能的解決方案:

  1. 覆蓋設置與骨幹機型比較JSON。
  2. 覆蓋您的app.getOrders.get('orders') &服務器端代碼僅用於下拉更改,或手動從拉引的json中移除已存在的對象。
  3. 將您的代碼從initialize移動到另一個位置,例如移至collection.add事件處理程序。