0

我被这件事难住了。我有一个简单的骨干关系模型:

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:usersandremove:users事件可以正常触发,但事件change:users不会。在渲染我的用户模型的 DetailsView 中,我还有一些简单的事件绑定:

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

但是,由于某种原因,change:usersSiteView 中的事件不会触发,而changeDetailsView 中的事件会触发。

这可能是因为:

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

2 回答 2

2

在我看来,更新:事件并不像您预期​​的那样工作。据我了解,它仅在密钥(即相关模型)更改时触发,但在您更改其属性时不会触发。这意味着,只有当您从一个用户切换到另一个用户时,它才会触发,而不是在您更改现有用户的属性时。这是我对源码第711行的理解。可能有用的是这些方面的东西:

this.model.get('users').each(function(user){
    user.bind(change,this.render,this);
},this);
于 2012-08-15T21:35:14.007 回答
0

更好的解决方案:

this.model.bind('relational:change:users', this.setSave, this);
于 2013-06-26T15:18:39.003 回答