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

Posted

技术标签:

【中文标题】Backbone.js:更改属性列表的智能更新【英文标题】:Backbone.js: smart update of a list of changed attributes 【发布时间】:2013-07-15 15:17:53 【问题描述】:

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

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

    保存模型的所有项目:这会将所有内容发送到 服务器,甚至仅在客户端使用的属性和属性 没有改变。这是新模型的默认设置(当 model.isNew() 返回 true)。 使用patch:true 保存只会发送更改的属性 模型到服务器。在 Backbone 中,这意味着 ONLY changedAttributes() 返回的属性将被发送。

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于Backbone.js:更改属性列表的智能更新的主要内容,如果未能解决你的问题,请参考以下文章

如何进行backbone.js UI测试

Backbone.js 本地存储,从服务器预先加载

Backbone.js 更改事件未触发

Backbone.js 路由而不更改 url

Backbone.js 在不重新加载页面的情况下更改 url

使用backbone.js更改URL