将 Backbonejs 升级到 1.0 后,从服务器获取集合会强制执行不响应的默认属性。
更具体地说,我创建了这个可以在jsfiddle中验证的测试。
假设我们有一个具有默认属性的骨干模型定义。属性text
可以从服务器以 JSON 格式接收[{ "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 中的回归还是我以错误的方式使用这个模型?