【问题标题】:Angular $destroy - Documentation recommends unbinding events manually but code shows otherwiseAngular $destroy - 文档建议手动取消绑定事件,但代码显示其他
【发布时间】:2015-01-15 19:33:49
【问题描述】:

https://docs.angularjs.org/guide/directive

通过监听 this($destroy) 事件,您可以移除可能导致内存泄漏的事件监听器。注册到作用域和元素的侦听器在销毁时会自动清理,但是如果您在服务上注册了侦听器,或者在未被删除的 DOM 节点上注册了侦听器,则必须自己清理或您可能会导致内存泄漏。

查看$destroy 的代码,它似乎解除了事件监听器的绑定: https://github.com/angular/angular.js/blob/d7ecab775ceefcd55a23780d005ce1c39cd8651b/src/ng/rootScope.js#L696

forEach(this.$$listenerCount, bind(null, decrementListenerCount, this));

那么,为什么 Angular.js 文档告诉我在发出 $destroy 事件时手动删除事件侦听器?

【问题讨论】:

  • 它告诉你不要销毁监听器,而是销毁 $timeout 或 $intervals 或 $http 等
  • 不,它声明you can remove event listeners。这只是$timeout or $intervals 的一个例子。还有比这更多的事件监听器,但他们不需要每个都举一个例子。
  • 如果你注册了 $rootScope 观察者的话。阅读 BUT 部分

标签: angularjs event-handling


【解决方案1】:

事件可以通过以下方式绑定:

  • 在标记中(命名函数调用绑定到内置数据绑定)
  • 在指令中(绑定到自定义数据绑定的匿名函数)
  • 在控制器中(DOM 事件处理程序绑定到 angular.element)
  • 在服务中(DOM 事件处理程序绑定到 angular.module)

Angular 有以下事件:

$viewContentLoaded $includeContentRequested $includeContentLoaded $includeContentError $routeChangeStart $routeChangeSuccess $routeChangeError $routeUpdate $locationChangeStart $locationChangeSuccess $销毁

DOM 有以下事件:

中止 自动完成 onautocompleteerror 取消 在线播放 oncanplaythrough 改变 点击 关闭 上下文菜单 oncuechange ondblclick 拖累 悬而未决 吸毒者 退出 ondragleave 拖拉机 拖拽启动 随叫随到 持续时间变化 一空 结束 输入 无效 onkeydown 按键按下 onkeyup 加载数据 加载元数据 加载启动 onmousedown onmouseenter onmouseleave onmousemove onmouseout 鼠标悬停 onmouseup 鼠标滚轮 暂停 在线播放 在玩 进行中 汇率变动 复位 寻求 寻访 选择 展出 在排序 已安装 提交时 暂停 准时更新 切换 onvolumechange 等待 模糊 错误 聚焦 负载 调整大小 上卷 后印 印前 卸载前 onhashchange 改变语言 留言 在线离线 在线 隐藏 onpageshow 弹出状态 存储 卸载 onreadystatechange

参考文献

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-05
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 2022-12-18
    • 2019-05-25
    • 2015-11-22
    相关资源
    最近更新 更多