我一直在一个新项目上使用Backbone,到目前为止一直都很喜欢它,但是我遇到了一个我似乎无法绕过的拦截器。
在没有尝试解释我的整个域模型的情况下,我发现当你保存模型时,响应会从服务器返回并再次进行解析,创建新的子对象,从而打破我之前放入的事件绑定宾语。
例如,如果我从服务器返回时保存ContentCollection
(它的Backbone.Model不是集合),则会解析响应并在this.contentItems
中创建一个新的集合,我对this.contentItems
的所有约束力。有没有办法解决这个问题?告诉主干不要以某种方式解析响应?从原始列表中取出绑定,然后将它们重新附加到新列表中?
App.ContentCollection = Backbone.Model.extend({
urlRoot: '/collection',
initialize: function() {
},
parse: function(resp, xhr) {
this.contentItems = new App.ContentList(resp.items)
this.subscriptions = new App.SubscriptionList(resp.subscriptions)
return resp
},
remove: function(model){
this.contentItems.remove(model)
this.save({'removeContentId':model.attributes.id})
},
setPrimaryContent: function(model){
this.save({'setPrimaryContent':model.attributes.id})
}
})
有没有人遇到过这个?
答案 0 :(得分:3)
我认为这里的问题是您使用parse()
方法的方式。 Backbone只希望此方法获取服务器响应并返回属性的散列 - 而不是以任何方式更改对象。因此,Backbone在this.parse()
内调用save()
,而不是期望有任何副作用 - 但是您重写.parse()
的方式,您在调用函数时更改模型。
我过去处理这个用例的方法是在第一次调用fetch()
时初始化集合,如:
App.ContentCollection = Backbone.Model.extend({
initialize: function() {
this.bind('change', initCollections, this);
},
initCollections: function() {
this.contentItems = new App.ContentList(resp.items);
this.subscriptions = new App.SubscriptionList(resp.subscriptions);
// now you probably want to unbind it,
// so it only gets called once
this.unbind('change', initCollections, this)
},
// etc
});