【问题标题】:The best way to undelegate events once a view is no longer needed不再需要视图后取消对事件的委托的最佳方法
【发布时间】:2012-05-24 08:57:33
【问题描述】:

在视图remove() 方法中调用undelegateEvents() 是一种不好的做法吗?为什么骨干人员默认不包含它?

我意识到,当简单地重新初始化一个视图变量时,我遇到了很多绑定问题。尽管undelegateEvents() 在创建新视图时被自动调用,但它正在尝试取消对新实例化视图的事件的委托,而不是前一个视图。因此,除非每次都手动调用它,否则幽灵事件回调仍然存在并搞砸我的应用程序。

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

【问题讨论】:

  • 您是否在切换视图而不是创建新视图时重复使用el? jQuery delegate 绑定到视图的 el
  • @muistooshort 是的,我经常重复使用同一个 DOM 容器,并将其提供给视图,而不是每隔一段时间创建和附加一个新容器。这就是为什么删除幽灵回调至关重要
  • 然后在清理过程中调用undelegateEvents 是可以预料的并且很好。 remove 没有 undelegateEvents 因为它会杀死整个 el 并且没有意义。
  • 如果您有自定义的remove() 方法,请在您的问题中发布。

标签: javascript backbone.js


【解决方案1】:

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

除非您实现自己的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() 的简写。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多