改变骨干关系中的事件不起作用

时间:2014-03-14 13:18:10

标签: javascript backbone.js backbone-relational

我正在使用与HasMany关系的骨干关系。添加事件被触发但更改事件没有。

Model1 = Backbone.RelationalModel.extend({
    urlRoot: '/Leve1/',

    initialize: function () {
        this.listenTo(this, 'add:relatedModels', this.relationModelAdd);
        this.listenTo(this, 'change:relatedModels', this.relationModelChange);
    },

    relations: [{
        type: Backbone.HasMany,
        key: 'relatedModels',
        relatedModel: 'InnerModel'
    }],

    relationModelAdd: function () {
        alert("Add in related model");
    },

    relationModelChange: function () {
        alert("Change in related model");
    }
});

InnerModel = Backbone.RelationalModel.extend({
    urlRoot: '/Level2/'         
});

var outerModel = new Model1({
    id: 'model1',
});
var innerModel = new InnerModel({
    id: 'model11',          
});

outerModel.get('relatedModels').add(innerModel);

innerModel.set({
    id: 'model13'
});

使用HasOne关系更改事件但不能使用HasMany。

1 个答案:

答案 0 :(得分:4)

看来,如果在HasMany关系集合中的任何模型change中发生更改,则Model1事件不会触发外部模型InnerModel。请参阅GitHub上的Backbone.RelationalModel中的问题:Change events not being fired on collection change。提交人说,该问题已经结束:

  

我不认为默认情况下针对任何关系的每次修改都会触发change事件是一个好主意,但通过向Backbone.RelationalModel添加辅助方法,这样做很容易做到,因为this._relations实际上确实为您提供了相关的模型或集合。您可以快速首次尝试:

Backbone.RelationalModel.prototype.bindRelationEvents = function() {
    var dit = this;
    _.each( this.getRelations(), function( relation ) {
        relation.related && relation.related.bind( 'all', function() {
            dit.trigger.apply( dit, arguments );
            // Or even simply `dit.render()`, if the number of events is reasonable...
        } );
    });
};
     

然后调用this.bindRelationEvents来查找您想要从他们的关系中接收所有事件的对象。