一旦不再需要视图,取消管理事件的最佳方法

时间:2012-05-24 08:57:33

标签: javascript backbone.js

在视图undelegateEvents()方法中调用remove()是不好的做法?为什么主干人默认不包括它?

我意识到在重新初始化视图变量时,我遇到了很多绑定问题。虽然在创建新视图时会自动调用undelegateEvents(),但它会尝试取消新实例化视图的事件,而不是前一个视图。因此,除非每次手动调用它,否则ghost事件回调仍然存在并且搞砸了我的应用程序。

处理此问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:6)

  

在视图undelegateEvents()方法中调用remove()是不是一种不好的做法?

除非您实施自己的remove()并且不致电Backbone.View.remove()this.$el.remove(),否则没有必要。那就是你至少使用jQuery。在Backbone视图上调用remove()将调用jQuery.remove(),这将删除所有DOM事件侦听器。

  

我意识到当涉及重新初始化视图变量时,我遇到了很多绑定问题。

很多人似乎都在使用Backbone.Events,这是他们之后不需要清理的某种魔法,例如:

var View = Backbone.View.extend( {

  initialize : function ( options ) {

    // `on()` or `bind()`

    this.model.on( 'something', this.render, this );

  }

} );

请参阅Delegating events to a parent view in Backbone

上的答案

您遇到的鬼事件是否可能与Backbone事件有关,而不是DOM事件?

如果您保留模型对象但想要摆脱该视图对象或其Backbone事件注册,则必须执行view.model.off( null, null, this );。您必须取消绑定在任何外部对象上注册的事件。如果需要,您可以覆盖Backbone.View.remove()并在那里执行,但默认情况下,该方法只是view.$el.remove()的简写。

相关问题