Angular 何时使用Ngzone.run()?
我在angular项目中遇到了一个bug,通过将代码包装到Angular 何时使用Ngzone.run()?,angular,ngzone,Angular,Ngzone,我在angular项目中遇到了一个bug,通过将代码包装到 this.zone.run(() => {/* my code here */}); 如答案所述 我以前对区域的理解是angular无法检测到第三方库的异步回调所做的更改,因为“它们不在angular的区域”。如果单击按钮,则触发的事件不是浏览器的本机单击事件,而是angular创建的自定义(修补的)单击事件,angular的处理程序运行在区域中,因此angular知道其回调处理程序所做的更改 但我无法理解在第三方回调中运行ro
this.zone.run(() => {/* my code here */});
如答案所述
我以前对区域
的理解是angular无法检测到第三方库的异步回调所做的更改,因为“它们不在angular的区域
”。如果单击按钮
,则触发的事件不是浏览器的本机单击
事件,而是angular创建的自定义(修补的)单击
事件,angular的处理程序
运行在区域
中,因此angular知道其回调处理程序所做的更改
但我无法理解在第三方回调中运行router.navigate()
会造成这个问题(正如github问题所指出的)。路由器本身不是一种服务吗?为什么在第三方回调中调用时,它不自动通知angular的区域
我是通过使用路由器来解决这个问题的。在NGXS的state reducer中导航
我的问题是:
有人能解释一下我什么时候需要将代码包装到NgZone
?
调试数小时并意识到我的代码超出了区域
上下文是令人厌烦的。
- 当触发某个事件时,它会通知angular检测更改
- 如果您使用的是mouseUp()或mouseDown()事件,则每次更改时,它都会通知angular检测更改
- 如果我们不希望这些更改在angular运行时发生(这会降低应用程序的性能),我们可以在angular zone之外运行它
- 与此相反,如果我们非常希望获得每个更新,那么我们可以使用ngZone.run()。意味着它将正常运行更改检测
Angular本身使用发动机罩下的ngZone来检测变化
因此,如果我们已经离开了角度区域,那么回来时我们使用ngZone.run()
ngZone.run()
在单元测试路由时特别有用
it('should redirect if condition true, fakeAsync(() => {
router.navigate(['']);
fixture.ngZone.run(() => {
component.redirectIfConditionTrue();
});
tick();
expect(location.path()).toBe('/AgentLeadsManager');
}));
- 资料来源:这是我唯一一次使用它
Zone.js是用于跟踪和拦截异步操作的执行上下文
比如:DOM事件(点击
,按键
,按键
,等
),设置超时
,设置间隔
<代码>XMLHttpRequest
s)
NgZone只是Zone.js
的API的包装器服务
Angular团队决定在处理Angular时需要对执行上下文进行抽象,因此他们在Angular中构建了Zone.js和一个包装器(非正式的适配器模式)
因此,基本上是为了回答您的问题:当处理任何类型的第三方库时,这些库与Zone.js中Angular的运行上下文无关(除非您决定不需要执行上下文,并且可以使用NoopNgZone
)
@dasfsa,如果事件不在“角度区域”,则angular无法检测到该事件。换句话说,Angular可以检测router.navigate,但无法检测使router.navigate执行的事件文档中提供的示例确实解释了它的用法:我正在解决某个问题,该问题将我指向此区域。我需要从iframe外部的脚本更新组件内部的属性。我将演示放在这里:我发现我需要this.ngZone.run(()=>this.router.navigate([“login”])。然后()代码>在异步
功能中导航时。