Backbone.js部分模型更新

gga*_*ber 34 javascript backbone.js

保存更改时,是否可以仅发送模型的已修改属性?

顺便说一句,是否有任何"官方"Backbone.js小组/邮件列表可以提出这类问题?

Jul*_*ien 46

Backbone不支持开箱即用,但您拥有实现这一目标的所有工具.如果您查看Backbone.sync,您将看到它在您的模型上调用了JSON以获取要发送的实际数据.现在你可能需要调整一下,但这里有它的要点:

initialize: function(){
  this.dirtyAttributes = {}
},
set: function(attrs, options){
  Backbone.Model.prototype.set.call(this, attrs, options);
  _.extend(this.dirtyAttributes, attrs);
},
toJSON : function(){
  json = this.dirtyAttributes;
  this.dirtyAttributes = {};
  return json;
}
Run Code Online (Sandbox Code Playgroud)

如果你想要一个完整的解决方案,你需要应用相同的逻辑来取消设置,清除,保存等.但我想你会得到如何做到这一点.我把脏属性的重置放在toJSON函数中,但它应该在成功回调中(当调用save时).

  • @gustavogb好吧,谢谢你让StackOverflow变得更糟. (8认同)

And*_*are 33

目前,骨干网不支持将部分模型发送到服务器.这将是一个有趣的补充.

如果您浏览源代码,您可以看到Backbone.sync(负责与数据存储通信的主干部分)是骨干网中最简单的组件之一,只需在jQuery或Zepto中包含ajax支持.


UPDATE

启动主干版本0.9.10,本机支持部分模型更新

model.save(attrs, {patch: true})
Run Code Online (Sandbox Code Playgroud)

  • 看起来只发送更改字段的最简单方法是`model.save(model.changedAttributes(),{patch:true});`.这是在Backbone 1.0.0. (4认同)
  • 补丁不是"创建"一个新对象和"更新"一个对象的好主意,它不是一个宁静的设计.我建议覆盖`sync`方法 (3认同)
  • @HarryPehkonen changedAttributes不会跟踪同步之间的脏状态,仅在集合之间跟踪,通常仅用于更改回调.这不适用于这种情况 (2认同)

Jay*_*mar 6

更新:启动主干版本0.9.10,本地支持部分更新

model.save(attrs, {patch: true})
Run Code Online (Sandbox Code Playgroud)


直到0.9.9 一种方法没有直接编辑backbone.js库文件.只需在应用程序js文件中添加以下代码,并在backbone.js加载后加载它.

//override the Backbone.sync to send only the changed fields for update (PUT) request
var Original_BackboneSync = Backbone.sync;

Backbone.sync = function(method, model, options) {
    /* just handle the data picking logic for update method */
    if (!options.data && model && method == 'update') {
        options.contentType = 'application/json';
        options.data = JSON.stringify(model.changedAttributes() || {});
    }

    //invoke the original backbone sync method
    return Original_BackboneSync.apply(this, arguments);
};

//Tested in Backbone.js 0.9.1
Run Code Online (Sandbox Code Playgroud)