2016-05-07 5 views
0

私は、その中に別のビュー(子ビュー)を持つビュー(親と呼ぶ)を持っています。親ビューには、「コンテキストメニュー」イベントを使用する要素があります(右クリックすると、一連のメニューオプションが表示されます)。ユーザーがメニューから項目を選択すると、コールバックが発生します。そこから、子ビューでイベントをトリガーします。ここに私のトリガーである:私の子ビューの初期化関数でBackbone.js ListenToOnceが2回呼び出される

that.trigger("editFileFolder", {fileType: fileType}); 

、私はこれを持っている:

this.listenToOnce(this.options.parent,'editFileFolder', this.editFileObjectEvent); 

editFileObjectEvent機能を作成する別のビュー(いくつかのフィールドを持つダイアログ、キャンセルボタンを呼び出し、保存ボタン)。ユーザーがキャンセルをクリックすると、すべて正常に動作します。使用が保存ボタンをクリックすると、ビューはajax呼び出しを行い、サーバーに保存してダイアログを閉じます。しかし、次にユーザーが右クリックして同じメニュー項目を選択すると、editFileObjectEventが2回呼び出されます(その結果、ダイアログは親ビューに2回追加されます)。

誰もがなぜ2回呼び出されているのか、これを解決する方法を説明できますか?特定のコードを表示したい場合は、お知らせください。追加することができます。たくさんあるので、私はその質問を圧倒したくありません。私はthis.listenToOnceを呼び出す関数が2回呼び出され考える

おかげ

+0

私は 'this.listenToOnce'が2回呼び出され – andlrc

+0

うーん呼び出す機能を考えて、あなたが正しいようです。このリスナーがすでに配置されているかどうかを判断する方法はありますか? – jason

+0

パブリックAPIだとは思いません。しかし、あなたは 'this._listeningTo'を見ることができます – andlrc

答えて

2

。これを避けてください。これが不可能な場合は、あなたはリスナーのみ結合する前にそれをアンバインドすることにより、一度バインドされていることを確認することができます

this.stopListening(this.options.parent, 'editFileFolder', this.editFileObjectEvent); 
this.listenToOnce(this.options.parent, 'editFileFolder', this.editFileObjectEvent); 

それとも、二回結合を防ぐためにあなたのインスタンスのプロパティを持つことができます:

if (!this.__boundListener) { 
    this.listenToOnce(this.options.parent, 'editFileFolder', this.editFileObjectEvent); 
    this._boundListener = true; 
} 

すべてのリスナーはthis._listeningToに登録されていますが、イベントが既にバインドされているかどうかを調べることができます。

あなたはまた、あなたのコードをリファクタリングすることができます

MyModel.extend({ 
    initialize: function() { 
    this.bindListenToOnce = _.once(this.bindListenToOnce); 
    }, 
    abc: function() { 
    // do stuff 
    this.bindListenToOnce(); 
    // do stuff 
    }, 
    bindListenToOnce: function() { 
    this.listenToOnce(this.options.parent, 'editFileFolder', this.editFileObjectEvent); 
    } 
}); 
関連する問題