0

バックボーン ビューを定義します

Views.BaseView = Backbone.View.extend({
   viewState : new Backbone.Model(),
   initialize: function(){
       this.listenTo(this.viewState, "change:stateType", this.onAlertType)
  }
}

BaseView を拡張する GlobalView を取得しました。これにより、ItemView を表示および管理できます。ItemView は BaseView も拡張します。

私の問題は、 ItemView のレベルで viewState.stateType を変更した場合:

MyItemView.viewState.set('stateType', 1)

GlobalView は、ItemView の viewState プロパティの変更について最初に通知されます。

私の GlobalView は特定の「listenTo」を取得しません。私が定義する唯一の「listenTo」は BaseView レベルのものです。

itemView で定義された viewState オブジェクトの変更が globalView に通知されるのはなぜですか? 誰かが私が間違っていることを見ていますか? それは既知のバグですか?

4

1 に答える 1

1

を使用してバックボーンオブジェクト(たとえばView)にプロパティを定義する.extendと、プロパティはオブジェクトのプロトタイプにアタッチされます。これは、同じプロパティ値がそのオブジェクトのすべてのインスタンスで共有されることを意味します。

オブジェクトの各インスタンスのすべてのメソッドに対して新しい関数インスタンスを作成する必要がないため、これはメソッドで完全に理にかなっています。また、元の値は変更されないため、不変の値型プロパティでは比較的無害です。プロパティを別の値に再割り当てすると、インスタンスに新しいプロパティが作成され、変更せずにプロトタイププロパティが非表示になります。

var SomeView = BaseView.extend({
  foo:'foo'
});

var view1 = new SomeView();
var view2 = new SomeView();

view1.foo = 'bar';
console.log(view1.foo, view2.foo); // -> bar, foo

この問題は、プロパティを、、などの可変オブジェクトに設定すると発生しObjectますArray。プロパティを再割り当てせずにそのオブジェクトを変更すると、すべてのインスタンスでそのプロパティ値が変更されます。

あなたの場合、viewStateすべてのビューのプロパティは同じモデルインスタンスを指しているので、次のようになります。

var view1 = new SomeViewThatExtendsBaseView();
view1.viewState.set('stateType', 1);

var view2 = new SomeOtherViewThatAlsoExtendsBaseView();
console.log(view2.viewState.get('stateType')); // -> 1

バックボーンを使用してインスタンスプロパティを宣言するには、次のinitializeメソッドでインスタンスプロパティを作成する必要があります。

Views.BaseView = Backbone.View.extend({
  initialize: function() {
    this.viewState = new Backbone.Model();
    this.listenTo(this.viewState, "change:stateType", this.onAlertType)
  }
}
于 2013-02-11T11:07:10.720 に答える