将Backbonejs升级到1.0后,从服务器获取集合会强制执行未响应的默认属性。
更具体地说,我创建了此测试,可以在jsfiddle中验证。
假设我们有一个带有默认属性的主干模型定义。可以使用JSON text
从服务器接收属性[{ "text": "updated", "id" : 1}]
,并在客户端维护属性selected
。
var Model = Backbone.Model.extend({
defaults: function () {
return {
text: 'default',
selected: false
};
}
});
如果我们使用此设置并从服务器获取数据,它将正常工作。现在假设我们在骨干集合中添加此模型,如下所示:
var Models = Backbone.Collection.extend({
url: '/json/',
model: Model
});
创建一个新的集合实例并填充fetch
:
var models = new Models();
models.fetch({
update : true
});
之后,我们在集合中选择一个模型,并将selected
属性更改为true:
var model = models.get(1);
model.set('selected', true);
现在,如果我们第二次调用fetch
集合,即使响应中没有这样的值,主干网也会将之前更改的属性清除为默认值false
:
models.fetch({
update : true
});
model = models.get(1);
获取selected
值将返回false
,而不是之前设置的true
。
model.get('selected');
解决方法:注释掉那些未从服务器收到的属性。
但是在那种情况下,我们从骨干中丢失了许多有用的功能。 这是Backbonejs 1.0的回归还是我以错误的方式使用这个模型?