我对此感到困惑。 我有一个简单的骨干关系模型:
window.Site = Backbone.RelationalModel.extend({
idAttribute: "_id",
// These are the relations to the user model.
relations: [{
type: Backbone.HasMany,
key: 'users',
relatedModel: 'window.User'
}],
});
我的用户模型(与站点模型相关)如下所示:
//Site User model
// -------------
window.User = Backbone.RelationalModel.extend({
});
用户模型故意保持愚蠢,因为我仍在进行原型设计。
我从服务器收到的用于水化网站和用户的 JSON 如下所示:
{
_id: foo,
users: [
username: bar,
password: fizz
]}
我难倒的是听众。站点视图(呈现我的网站集)上的事件如下所示:
initialize: function() {
//basic bindings
this.model.bind('change', this.setSave, this);
this.model.bind('destroy', this.remove, this);
// bindings to sub-models
this.model.bind('add:users', this.setDetailsView, this);
this.model.bind('remove:users', this.setSave, this);
this.model.bind('change:users', this.setSave, this);
add:users
和remove:users
事件可以正常触发,但change:users
事件不会。在呈现我的用户模型的 DetailsView 中,我还有一些简单的事件绑定:
initialize: function() {
this.model.bind('change', this.render, this);
this.model.bind('destroy', this.remove, this);
但是,由于某种原因,SiteView 中的change:users
事件不会触发,而 DetailsView 中的change
事件会触发。
这可能是因为:
- 用户模型上的
change
事件在两个不同的视图中绑定两次? - 用户模型不是双向的?
它看起来像更新:事件并没有完全按照您的预期工作。根据我的理解,它仅在键(即相关模型)发生变化时才触发,但如果您更改其属性,则不会触发。这意味着,仅当您从一个用户切换到另一个用户时,它才会触发,而不是在您更改现有用户的属性时触发。这是我对源代码第 711 行的理解。可能有效的是这样的:
this.model.get('users').each(function(user){
user.bind(change,this.render,this);
},this);
更好的解决方案:
this.model.bind('relational:change:users', this.setSave, this);