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が含まれ、これには明らかに製品が含まれます。初期化では、製品が変更されて破棄されたときに、グループの更新メソッドがexampleと呼ばれるようにしようとしています。すべてがうまく機能しているようで、イベントが呼び出され、属性は見栄えがしますが、製品モデルでdestroyメソッドを呼び出すと失敗します。アップデートでは、製品コレクションの内容を印刷しようとしますが、削除する前に製品を取得します。500msのタイムアウト後にこのデバッグ行を呼び出すと、内容は問題ありません。製品が削除されるなど。

したがって、私の理解によれば、製品の破棄イベントが呼び出され、コレクションから実際に削除される前にグループに渡されます。私は何が間違っているのですか?

4

1 に答える 1

1

Backboneは、モデルのイベントをリッスンすることにより、コレクション内の破棄されたモデルの削除を処理します。Backbone.Model --destroyおよびBackbone.Collection--_onModelEventdestroyのソースコードを参照してください。

ハンドラーが実行される順序は保証されていません。別のものを使用する必要があります。たとえば、モデルが実際に削除された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);
},

完全な例については、このFiddlehttp ://jsfiddle.net/NUtmt/を確認してください。

于 2012-05-28T10:24:41.757 に答える