在Chrome中调试以查找我的应用程序中某些慢响应的来源时,我注意到在Peformance选项卡中按住 Shift 键会生成重复的keydown
个事件,每个事件都会触发改变Angular中的检测。下图显示了其中一个的“性能”选项卡。这些事件对我的应用程序没用;我知道当 Shift 和 Ctrl 被自己按下时没有任何变化。我只想知道当发生单击事件时,或者按下字符或功能键时键是否关闭。 “性能”选项卡中报告的额外活动也使得分析调试的实际内容变得更加困难。
有没有办法阻止或取消对全局keydown
事件的更改检测,例如 Shift 和 Ctrl ?
答案 0 :(得分:1)
Change detection
的角度工作中的 zone.js
。
zone.js
提供了一种名为runOutsideAngularZone()
。
this.zone.runOutsideAngular(() => {
window.document.addEventListener('mousemove', this.mouseMove.bind(this));
});
这将允许您在角度变化检测之外使用keydown或keyup / mouse move等事件。
有关详细信息,请访问:zones in angular
答案 1 :(得分:0)
我实际上已经实现了一个全局捕获keydown
事件监听器来阻止keydown
事件的传播,但我在识别密钥时犯了一个错误。正确完成后,处理的globalZoneAwareCallback
部分被删除(在问题中的图像右侧); globalZoneAwareCaptureCallback
部分仍然存在。
解决方案是停止在全局事件监听器中传播keydown
事件,而这个事件监听器本身不会触发变化检测:
keydown
事件(例如,在服务中)window.document.addEventListener
传递给NgZone.runOutsideAngular
。这很重要,因为addEventListener
会触发角度变化检测,这与我最初的想法相反。this.zone.runOutsideAngular(() => {
window.document.addEventListener("keydown", (event: KeyboardEvent) => {
switch (event.which || event.keyCode) {
case 16:
case 17: {
event.stopPropagation();
break;
}
}
});
});