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

Pre*_*hev 11 javascript backbone.js

调用undelegateEvents()view remove()方法是不好的做法?为什么骨干人员默认不包括它?

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

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

JMM*_*JMM 6

调用undelegateEvents()view remove()方法是不好的做法?

没有必要,除非你实现自己的remove(),你不打电话Backbone.View.remove()this.$el.remove().那就是你至少使用jQuery.调用remove()Backbone视图将调用jQuery.remove()哪个将删除所有DOM事件侦听器.

我意识到,当简单地重新初始化视图变量时,我陷入了这么多绑定问题.

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

var View = Backbone.View.extend( {

  initialize : function ( options ) {

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

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

  }

} );
Run Code Online (Sandbox Code Playgroud)

请参阅我在Backbone中将事件委派给父视图的答案

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

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