gpt4 book ai didi

javascript - Backbone Model.save() 终止所有事件绑定(bind)

转载 作者:行者123 更新时间:2023-11-29 20:11:10 25 4
gpt4 key购买 nike

我一直在使用Backbone在一个新项目上,到目前为止我很喜欢它,但我遇到了一个我似乎无法绕过的障碍。

没有尝试解释我的整个领域模型,我发现当你保存一个模型时,响应从服务器返回并再次被解析,创建新的子对象并因此打破我之前放置的事件绑定(bind)目的。

例如,如果我保存 ContentCollection(它是一个 Backbone.Model 而不是一个集合),当它从服务器返回时,响应会被解析并在 this 中创建一个新的集合。 contentItems,它打破了我在 this.contentItems 上的所有绑定(bind)。有什么办法可以解决这个问题吗?告诉主干不要以某种方式解析响应?从原始列表中获取绑定(bind),然后将它们重新附加到新列表?

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

有人遇到过这个吗?

最佳答案

我认为这里的问题是您使用 parse() 方法的方式。 Backbone 只希望此方法获取服务器响应并返回属性散列 - 不会以任何方式更改对象。所以 Backbone 在 save() 中调用 this.parse(),不希望有任何副作用——但是你重写 .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
});

关于javascript - Backbone Model.save() 终止所有事件绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9728809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com