我刚刚开始使用 Angular 2,我想知道是否有人可以告诉我从元素中动态添加和删除事件侦听器的最佳方法。
我有一个组件设置。单击模板中的某个元素时,我想将 mousemove
的侦听器添加到同一模板的另一个元素。然后,我想在单击第三个元素时删除此侦听器。
我只是使用普通的 Javascript 来获取元素,然后调用标准 addEventListener()
来完成这项工作,但我想知道是否有更“ Angular2.0 ”的方式来做这件事,我应该研究一下。
原文由 popClingwrap 发布,翻译遵循 CC BY-SA 4.0 许可协议
渲染器在 Angular 4.0.0-rc.1 中已被弃用,请阅读下面的更新
angular2 方法 是使用来自 渲染器 的
listen
或listenGlobal
例如,如果您想向组件添加点击事件,则必须使用 Renderer 和 ElementRef(这也为您提供了使用 ViewChild 或任何检索
nativeElement
的选项)您可以使用
listenGlobal
这将使您可以访问document
,body
等。请注意,由于
listen
和listenGlobal
返回一个函数来删除监听器(参见 beta.2 的 变更 日志中的重大更改部分)。这是为了避免大型应用程序中的内存泄漏(请参阅 #6686 )。因此,要删除我们动态添加的侦听器,我们必须将
listen
或listenGlobal
分配给将保存返回函数的变量,然后我们执行它。这是一个带有示例工作的 plnkr 。该示例包含
listen
和listenGlobal
的用法。将 RendererV2 与 Angular 4.0.0-rc.1+ 一起使用(从 4.0.0-rc.3 开始的 Renderer2)
25/02/2017 :
Renderer
已被弃用,现在我们应该使用RendererV2
(见下一行)。查看 提交。10/03/2017 :
RendererV2
更名为Renderer2
。查看 重大变化。RendererV2
不再有listenGlobal
全局事件(文档、正文、窗口)函数。它只有一个实现这两个功能的listen
函数。作为参考,我复制并粘贴了 DOM Renderer 实现的 源代码,因为它可能会改变(是的,它是有角度的!)。
如您所见,现在它验证我们是否正在传递一个字符串(文档、正文或窗口),在这种情况下,它将使用内部
addGlobalEventListener
函数。在任何其他情况下,当我们传递一个元素(nativeElement)时,它将使用一个简单的addEventListener
要删除监听器,它与
Renderer
在 angular 2.x 中相同。listen
返回一个函数,然后调用该函数。例子
plnkr 与 Angular 4.0.0-rc.1 使用 RendererV2
plnkr 与 Angular 4.0.0-rc.3 使用 Renderer2