【发布时间】:2017-07-19 13:17:10
【问题描述】:
我遇到了 Zone.js 和非角度 DOM 元素事件的问题。
当我们将 javascript 函数分配给 HTML 标记中的任何 DOM 元素,然后以编程方式将相同的 DOM 元素重新分配给其他或相同的函数时,就会发生这种情况。
例如你有这个标记
<button id="button1" onclick="test1()">button 1</button>
然后在 JS 的某个地方,你用其他一些函数重新分配 button1 onclick
document.getElementById('button1').onclick = test3;
在这种情况下,会进行两个函数调用。第一个是原始分配的方法,然后第二个是新分配的方法。
我创建了一个 PLUNKER 来演示这种行为。
在示例中,我们在屏幕上有一个 Angular 应用程序和 2 个非 Angular 按钮。每个按钮最初都分配了一个功能,该功能仅将一些文本打印到控制台。
一个按钮(onclick 事件上的按钮 1)只打印 调用的测试 1 方法。
另一个按钮(onclick 事件上的按钮 2)打印 调用的测试 2 方法。 并且还为 button1 的 onclick 分配了一个新函数。这个新函数打印 test 3 method called.
场景-
让应用程序加载。当您可以看到 应用工作 时,请执行以下操作:-
1.打开调试器控制台。
2. 点击按钮 2
3.检查控制台
4. 点击按钮 1.
5. 检查控制台。
期待。
• 单击按钮 2 时,我们应该会看到 调用了测试 2 方法。
• 单击按钮 1 时,我们应该看到 调用了测试 3 方法。
实际
• 单击按钮 2 时,我们会看到 调用了测试 2 方法。
• 单击按钮 1 时,我们看到 调用了测试 1 方法。 随后是 测试 3
方法调用。
PLUNKER 链接
https://plnkr.co/edit/ymKcHjWPrDiG73NfWBle?p=preview
在调试时,我看到一个方法称为 DOM 元素事件(来自 onclick 的 test1),而另一种方法(test3)由 zonejs 调用
(为了这个调试,我在本地机器上的 zone.js 文件中添加了 console.log)
我看到 zonejs 注册了几乎所有与屏幕上任何 DOM 元素相关的事件。
那么,这是我面临的问题吗?或者这是预期的行为还是我在哪里出错了?请提供一些信息/指针。
【问题讨论】:
-
Plunker 似乎什么也没做。不过可能是(临时)Plunker 问题。
-
zone.js 仅影响在区域内进行的事件绑定。 Angular 在这样的区域内运行。如果您在室外进行,则不涉及区域。
-
@GünterZöchbauer,
NgZone不参与。但根区仍然监听所有事件 -
@Maximus 为什么要这样做?这是新事物吗?
-
@GünterZöchbauer,我的意思是它修补和拦截所有异步事件。它与 Angular 无关