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

Can I save changed attributes of model after several set

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

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

我该怎么做?

为模型绑定监听器

如果你在视图中设置值,监听器应该是这样的(最好写在初始化函数中)

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

还有你的监听函数

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

根据changedAttributes

Optionally, an external attributes hash can be passed in, returning the attributes in that hash which differ from the model.

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

var oldAttrs = model.toJSON();

// ...do modifications here

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

虽然 ,但我有更好的方法来实现他的建议。

与其制作属性的原始克隆,我更喜欢在应用程序启动或视图初始化时保留模型的 master 副本。

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();
    },
});