在我的主干应用程序中,我有一个看起来有点像这样的模型,
{
"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();
}
});
答案 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数组,然后可以根据需要获取它们。