1

骨干又是一些简单的问题。这里没有冗长的描述,而是一些示例代码:

var Group = Backbone.Model.extend({

    defaults: {
        Product: new Products()
    },

    initialize: function(data){
        var _this = this;

        var products = new Products(data.Product);
        this.set('Product', products);

        this.get('Product').each(function(product){
            product.on('destroy', function(){
                _this.trigger('change');
            }, _this);
        });

        this.bind('change', this.update, this);
    },

    update: function(){
        console.info("something changed");

        console.log(this.get('Product').toJSON());
    },

});

所以组模型包含 Product-collection,其中显然包含产品。在初始化时,我试图确保在更改和销毁产品时调用组的更新方法。一切似乎都运行良好,事件被调用,属性看起来很棒但是当我在产品模型中调用destroy方法时它失败了。在更新中,我尝试打印产品集合的内容,我得到的是在删除完成之前的产品。如果我在 500 毫秒超时后调用此调试行,则内容正常。产品被删除等。

因此,根据我的理解,调用产品的销毁事件,然后在实际从集合中删除之前将其传递给组。我究竟做错了什么?

4

1 回答 1

1

Backbone 通过侦听模型上的事件来处理集合中已销毁模型的删除destroy:请参阅Backbone.Model - destroyBackbone.Collection - _onModelEvent的源代码。

无法保证处理程序的执行顺序,您将不得不使用其他东西。例如,监听destroy集合上的事件,该事件将在模型实际删除后触发:

initialize: function(data){
    var _this = this;

    var products = new Products(data.Product);
    this.set('Product', products);

    this.get('Product').on("destroy", this.update, this);
    this.bind('change', this.update, this);
},

查看此 Fiddle http://jsfiddle.net/NUtmt/以获取完整示例。

于 2012-05-28T10:24:41.757 回答