2

我知道这个问题已经讨论过好几次了,但是我找不到它的许多方面之一的答案,我将在这里尝试解释。

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

  1. 保存模型的所有项目:这会将所有内容发送到服务器,甚至包括仅在客户端使用的属性和未更改的属性。这是新模型的默认值( model.isNew()返回时true)。
  2. Save withpatch:true只会将模型的更改属性发送到服务器。在 Backbone 中,这意味着发送返回的属性changedAttributes()

关键是changedAttributes()仅返回自上次change事件以来的更改。这对于不是一直更新的模型很有用,实际上可以负担得起对任何更改自动发出 ajax 请求。

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

你认为 Backbone.js 是否真的为这种同步提供了很好的支持?Bakcbone.js 是否跟踪自上次以来 save()的变化(而不仅仅是自上次change事件以来)?或者你必须“多次”这样做?

4

1 回答 1

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

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

于 2014-02-26T05:55:09.013 回答