8

次のようなビューを宣言しています。

var VirtualFileSelectorView = Backbone.View.extend({
    selected: function() {
        console.log("selected function");
    },

    initialize: function() {
        // Shorthand for the application namespace
        var app = brickpile.app;
        // bind to the selected event
        app.bind('selected', this.selected, this);
    }
});

次に、ここで確認できるように、このビューの 2 つのインスタンスをインスタンス化します: http://cl.ly/H5WI

問題は、選択したイベントが発生したときに、選択した関数が 2 回呼び出されることですか?

4

2 に答える 2

3

コメントスレッドを読んだ後、私はあなたの問題をどのように支援できるかをすでに理解していると思います:

コードでは、両方のビューが同じグローバル イベントselected()をリッスンしているため、両方が同時に応答し、各ビューの を独立してトリガーできるようにする必要があります。

これを行うための通常のアプローチは、ビューがモデルに関連付けられ、ビューがそのモデルのイベントをリッスンしているため、1 つのモデルに対してトリガーされたイベントのみがそれに関連付けられたビューに影響します。

このパターンは次のようになります。

// code simplified and not tested
var MyView = Backbone.View.extend({
  initialize: function( opts ){
    this.model = opts.model;
    this.model.on( "selected", this.selected, this );
  },

  selected: function( model ){
    // ...
  }
})

var oneModel = new MyModel();
var oneView = new MyView({ model: oneModel });

selectedこれで、必要なときに各モデルでイベントをトリガーするだけで済みます。

更新しました

このパターンは非常に一般的であるため、Backbone がView.model参照を関連付けるので、次のように実装できますView.initialize

initialize: function(){
  this.model.on( "selected", this.selected, this );
}
于 2012-06-04T17:43:49.680 に答える
1

As you have declared two instances of VirtualFileSelectorView you have two observers of the event selected.

Even if you are reusing the reference of the old View instance to make reference to the new View instance the old instance remains alive because there is still references targeting to it.

This is a very common issue in Backbone, I think people is starting to call it "ghosts Views".

To solve this you have to unbind all the events that the View is binding, in your example you can do:

app.virtualFileSelectorView.off( null, null, this );

Derick Bailey has an excellent post about this matter.

Also, with humility, I want to link to one study about this matter I did to try to understand this tenacious behavior.

于 2012-06-03T20:38:18.163 に答える