骨干和延迟破坏事件

时间:2012-05-28 09:47:37

标签: backbone.js

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

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方法时,它会失败。在更新中,我尝试打印产品集合的内容,我得到的产品是在删除之前完成的。如果我在500ms超时后调用此调试行,则内容正常。产品被移除等。

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

1 个答案:

答案 0 :(得分: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);
},

请查看此小提琴http://jsfiddle.net/NUtmt/以获取完整示例。