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:更改属性列表的智能更新的主要内容,如果未能解决你的问题,请参考以下文章