骨干关系变更事件没有解雇?

时间:2012-08-15 17:36:29

标签: backbone.js backbone-relational

我很难过。我有一个简单的骨干关系模型:

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
]}

我难倒的是听众。 SiteView(呈现我的SiteCollection)上的事件如下所示:

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:usersremove:users事件触发正常,但change:users事件没有。在呈现我的Users模型的DetailsView中,我还有一些简单的事件绑定:

initialize: function() {
  this.model.bind('change', this.render, this);
  this.model.bind('destroy', this.remove, this);

但是,出于某种原因,SiteView中的change:users事件不会触发,而DetailsView中的change事件会触发。

这可能是因为:

  • 用户模型上的change事件在两个不同的视图中绑定两次?
  • 用户模型不是双向的吗?

2 个答案:

答案 0 :(得分:2)

对我而言,看起来更新:事件并不像您预期​​的那样完全正常。根据我的理解,它只会触发,如果键,即相关模型发生变化,但如果更改其属性则不会触发。这意味着,只有当您从一个用户切换到另一个用户时,它才会触发,而不是更改现有用户的属性。这是我对源代码第711行的理解。 可能有用的是:

this.model.get('users').each(function(user){
    user.bind(change,this.render,this);
},this);

答案 1 :(得分:0)

更好的解决方案:

this.model.bind('relational:change:users', this.setSave, this);