我可以在几组之后保存模型的更改属性

时间:2017-01-03 09:03:41

标签: backbone.js

我多次调用set方法并更改多个属性。然后我想使用{patch: true}将更改的数据发送到服务器。

我可以使用model.save(attrs, {patch: true});,但我不知道attrs。我无法使用model.toJSON()(不需要的字段)或model.changedAttributes()(仅限最后一组)来获取attrs

我该怎么做?

3 个答案:

答案 0 :(得分:2)

根据changedAttributes

  

可选地,可以传入外部属性哈希,返回该哈希中与模型不同的属性。

因此,您可以在开始修改之前尝试使用toJSON缓存模型的状态。完成修改后,将新状态传递给changedAttributes方法以检索已更改的属性哈希,然后发送修补程序请求。像

这样的东西
var oldAttrs = model.toJSON();

// ...do modifications here

var changedAttrs = model.changedAttributes(oldAttrs);
dataTosend = model.pick(_.keys(changedAttrs));
model.save(dataTosend, {patch: true});

答案 1 :(得分:0)

绑定模型的监听器

如果你在视图中设置值,那么监听器应该是(更好地在初始化函数中写入)

  this.listenTo(this.model, "change", this.onModelValueChange);

你的听众功能

  onModelValueChange: function(model, args) {
      model.save(args.changed, {patch: true});
  }

答案 2 :(得分:0)

虽然TJ has the right answer,但我有更好的方法来实现他的建议。

我更喜欢在应用程序的开头或视图的初始化中保留模型的副本,而不是制作属性的原始克隆。

this.master = this.model.clone();
// ... then changes are made to this.model

准备保存时,使用主模型比较属性并直接检索更改。

var changes = this.master.changedAttributes(this.model.attributes);
if (changes !== false) this.model.save(changes, { patch: true });

有了这个,您可以完全跳过dataTosend = model.pick(_.keys(changedAttrs)),因为changes已经是与主模型初始状态的所有差异的对象。

如果是在模型保存后重新使用的视图:

var View = Backbone.View.extend({
    initialize: function() {
        this.updateMaster();
    },

    saveChanges: function() {
        var changes = this.master.changedAttributes(this.model.attributes);
        if (changes !== false) {
            this.model.save(changes, {
                patch: true,
                context: true,
                success: this.updateMaster
            });
        }
    },

    updateMaster: function() {
        this.master = this.model.clone();
    },
});