Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 何时使用Ngzone.run()?_Angular_Ngzone - Fatal编程技术网

Angular 何时使用Ngzone.run()?

Angular 何时使用Ngzone.run()?,angular,ngzone,Angular,Ngzone,我在angular项目中遇到了一个bug,通过将代码包装到 this.zone.run(() => {/* my code here */}); 如答案所述 我以前对区域的理解是angular无法检测到第三方库的异步回调所做的更改,因为“它们不在angular的区域”。如果单击按钮,则触发的事件不是浏览器的本机单击事件,而是angular创建的自定义(修补的)单击事件,angular的处理程序运行在区域中,因此angular知道其回调处理程序所做的更改 但我无法理解在第三方回调中运行ro

我在angular项目中遇到了一个bug,通过将代码包装到

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”])。然后()
异步
功能中导航时。