某些属性更改时,主干更改事件不会触发

时间:2014-11-28 14:46:20

标签: javascript backbone.js backbone-events backbone-model

在我的主干应用程序中,我有一个看起来有点像这样的模型,

{  
    "id" : 145,
    "name" : "Group Number 1",
    "information" : "Some kind of blurb about group number 1",
    "members" : {[
       "id" : 1,  
       "first_name" : "John",
       "last_name" : "Doe",
       "email" : "johndoe@goog.ecom"
    ]}
}

现在如果我运行this.model.get('members').add(newUser)新用户被添加到我的模型中的成员集合中 - 但它不会触发更改事件,为什么会这样?如果我更改了模型的名称,那么买一个更改事件会被激活吗?

所有这一切都是通过看起来像这样的视图完成的,

个人模型视图

Views.OrganisationView = Backbone.View.extend({

    tagName: 'div',
    className:'group group--panel col-sm-3',

    template : _.template( $('#tpl-single-group').html() ),

    events: {
        "click a[data-type=organisation], button[data-type=organisation]" : "edit",
        "click .js-delete-group" : "removeOrganisation",
    },

    initialize: function() {
        this.model.on("error", function(model, xhr, options){
            console.log(model, xhr, options);
            console.log(this);
        });
        this.listenTo(this.model, 'change', this.render);
        this.listenTo(this.model, 'destroy', this.removeView);
    },

    render: function() {
        this.$el.html( this.template({
            group: this.model.toJSON()
        }));

        return this;
    },

    removeView: function() {
        this.remove();
    },

    removeOrganisation: function(e) {
        this.model.destory();
        this.remove();
    },

    edit: function(e) {
        e.preventDefault();
    Routes.Application.navigate('/organisation/edit/' + this.model.get('id'), { trigger: false } );
        var editClient = new Views.OrganisastionEditView({
            model: this.model
        });
    }

});

请求事件被抛出的第二个令人困惑的事情(看起来好像我正在保存模型,但是错误事件也被抛出,但是xhr并没有错误我不是目前验证模型?

以下是我将用户保存到模型中的成员集合的方法,

var member = new Pops.Models.User({ id: element.data('id') });
member.fetch({
    success:function() {
        self.model.get('members').add(member);
        var model = self.model;
        self.$('.search').hide();
        self.$('button').show();
        var projectMember = new Pops.Views.UserInitialsWithAdmin({
            model: member
        });
        self.model.save({validate:false});
        self.$('.search').parent().append( projectMember.render().el );
        self.$('.search').remove();
    }
});

1 个答案:

答案 0 :(得分:0)

(我假设您给出的第一部分代码只是模型的简单JSON表示形式的指南,members是真实的Collection可用的add方法。)

回答第一个问题:只有在使用set更改模型属性时才会触发更改事件。在您的情况下,您将添加到members属性中存储的集合,但members属性仍然包含对之前所执行的相同集合的引用,这意味着从Backbone的角度来看,此属性没有改变。我建议将监听器直接附加到members集合。另请参阅How can I "bubble up" events on nested Backbone collections?

一般来说,Backbone中的嵌套模型并不简单,因为Jeremy Ashkenas has pointed out.通常最好保持模型平坦并将对相关模型的引用存储为id数组,然后可以根据需要获取它们。