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:usersandイベントは正常に発生しremove:usersますが、change:usersイベントは発生しません。Users モデルをレンダリングする DetailsView には、いくつかの単純なイベント バインディングもあります。

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

しかし、何らかの理由でchange:users、SiteView のイベントは発生しませんがchange、DetailsView のイベントは発生します。

これは次の理由による可能性があります。

  • Users モデルのchangeイベントは、2 つの異なるビューで 2 回バインドされていますか?
  • ユーザー モデルは双方向ではありませんか?
4

2 に答える 2

2

私には update: イベントが期待どおりに機能しないように見えます。私の理解では、キー、つまり関連するモデルが変更された場合にのみ起動しますが、属性を変更した場合は起動しません。これは、既存のユーザーの属性を変更した場合ではなく、あるユーザーから別のユーザーに切り替えた場合にのみ発生することを意味します。これは、ソース コードの 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 に答える