更新:私のコメントによると、私の問題は、イベントのバインドを解除していないビューに渡す余分なモデルがあることでした。イベント ハンドラーがトリガーされているのを見たとき、this.extra_model がエラー検証にも使用されていることを忘れていたため、ソースは this.extra_model ではなく this.model からのものであると想定しました。
解決策は、以下を追加することでした。
MyView = Backbone.extend({
//...
//add method to override BaseView
cleanUp: function() {
this.extra_model.off(null, null, this);
BaseView.prototype.cleanUp.apply(this, arguments);
},
//...
});
問題を確認していただきありがとうございます。プログラマーのエラーで申し訳ありません。
すべて: ビューをクリーンアップした後も古い/ゾンビ イベントがバインドされたままになるという問題があります。カスタム イベントをモデルにバインドすると問題が発生します。dom からビューを削除するときは、'this.model.off(null, null, this);' を呼び出します。さまざまなメッセージ ボードで提案されているように、「custom-handler」コールバックが chrome デバッガー ツールで削除されているのを見ることができますが、「custom-handler」のイベント ハンドラーが必要以上に呼び出されていることにまだ気付きます (毎回 1 つ余分にクリーンアップ後にビューを再作成するとき) イベントをトリガーするとき。私のクリーンアップコードに何かが欠けているかどうか誰かに教えてもらえますか? 前もって感謝します!
BaseView = Backbone.extend({
//...
displayErrors:function(){},
cleanUp: function(){
if (this.model) this.model.off(null, null, this);
if (this.collection) this.collection.off(null, null, this);
if (!this.options.persistDataAfterViewCleanup) {
if (this.model) delete this.model;
if (this.collection) delete this.collection;
}
//_.each(this.subViews, function(view){view.cleanUp();}); not needed yet.
this.undelegateEvents();
$(this.el).removeData().unbind();
//Remove view from DOM
this.$el.html('');
this.remove();
}
});
MyView = BaseView.extend({
initialize: function(){
//called manually from model using trigger
this.model.on('custom-handler', this.displayErrors, this);
}
});