Backbone Model.save()杀死所有事件绑定

时间:2012-03-15 21:57:58

标签: javascript backbone.js

我一直在一个新项目上使用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})
    }
})

有没有人遇到过这个?

1 个答案:

答案 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
});