Backbone.js:智能更新已更改属性的列表

时间:2013-07-15 15:17:53

标签: javascript backbone.js model save crud

我知道这个问题已经讨论了好几次了,但我找不到其中很多方面的答案,我将在这里解释一下。

模型save()在客户端和服务器之间保持同步。 Backbone.js推动你以这两种方式之一使用它(afaik):

  1. 保存模型的所有项目:这会将所有内容发送到 服务器,甚至仅在客户端和属性上使用的属性 没有改变的。这是新模型的默认值(何时 model.isNew()返回true)。
  2. 使用patch:true保存只会发送更改后的属性 模型到服务器。在Backbone中,它意味着 ONLY changedAttributes()返回的属性将被发送。
  3. 关键是changedAttributes()仅返回自上次change事件以来的更改。这对于不会一直更新的模型非常有用,实际上可以在任何更改时自动发出ajax请求。

    但是如果你有一个不断变化的模型(例如代码/文本编辑器或可以拖放的元素并且应该跟踪它的位置),你不能只保存每一个change事件。您需要按时间间隔保存自上次调用save()以来所有已更改的属性。

    你认为Backbone.js实际上为这种同步提供了很好的支持吗? Bakcbone.js是否跟踪自上次 save()以来的更改(并且不仅仅是自上次change事件以来)?或者你必须“忠诚地”做到这一点?

1 个答案:

答案 0 :(得分:0)

您必须使用自己的基本模型扩展骨干模型。

var BaseModel = Backbone.Model.extend({
    save: function(key, val, options){
        var attrs
        if (key == null || typeof key === 'object') {
          attrs = key;
          options = val;
        } else {
           (attrs = {})[key] = val;
        }  
        attrs = _.extend(this.unsaved || {}, attrs);
        this.unsaved = {};
        return Backbone.Model.prototype.save.call(this, attrs, options);
    },
    set: function(key, val, options) {
       var attr
       if (key == null) return this;
       if (typeof key === 'object') {
          attrs = key;
          options = val;
       } else {
         (attrs = {})[key] = val;
       }
       this.unsaved = _.extend(this.unsaved || {}, attrs);
       return Backbone.Model.prototype.save.call(this, attrs, options);
    }
});

完全未经测试的代码,但应该非常接近您需要做的事情。