2012-10-29 50 views
1

我試圖拯救只有這樣做如下改變我的模型的屬性:只保存更改的屬性在Backbone.js的

 this.model.set("likes", this.model.get("likes") + 1); 
     this.model.save(); 

和擴展骨幹原型就像這樣:

var backbone_common_extension = { 
    sync: function(method,model,options) { 
     options.contentType = 'application/json'; 
     if (method == 'update') { 
      options.data = JSON.stringify(model.changedAttributes() || {}); 
     } 
     console.log(options.data); 
     Backbone.sync.call(this, method, model, options); 
    } 
}; 

_.extend(Backbone.Model.prototype, backbone_common_extension); 

問題是model.changedAttributes()總是空的。我試過在set方法上傳遞{silent:true},但同樣的事情。在同步之前,我如何保持backbone不清除changedAttributes()?

回答

4

依靠changedAttributes這樣的東西往往不能很好地工作,Backbone並沒有真正定義好的set/commit/save/rollback系統,所以你會發現changedAttributes會被清空,期望它。

對你很幸運,那沒關係;不幸的是,這並不重要,因爲你的整個方法都是錯誤的。如果從服務器加載模型,然後從其他瀏覽器加入五個喜歡,會發生什麼?你的方法會覆蓋所有這些喜歡和數據會丟失。

您應該讓服務器管理喜歡的總數,並且您的模型應該簡單地發送一點「還有一個」消息,並讓服務器以新總數進行響應。我會做更是這樣的:

// On the appropriate model... 
add_like: function() { 
    var _this = this; 
    $.ajax({ 
     type: 'post', 
     url: '/some/url/that/increments/the/likes', 
     success: function(data) { 
      _this.set('likes', data.likes); 
     }, 
     error: function() { 
      // Whatever you need... 
     } 
    }); 
} 

然後/some/url/...處理器的服務器上會發出一個簡單的「加一個」更新其數據庫,併發送回喜歡的更新數量。這使數據庫負責管理數據和併發問題;數據庫擅長這種事情,而客戶端JavaScript並不是那麼重要。

相關問題