首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >何时使用Ngzone.run()?

何时使用Ngzone.run()?
EN

Stack Overflow用户
提问于 2018-07-21 11:22:25
回答 3查看 56.3K关注 0票数 53

我的角度项目中有一个bug,它最终通过将我的代码打包到

代码语言:javascript
复制
this.zone.run(() => {/* my code here */});

正如回答所述。

我以前对zone的理解是,angular不能检测第三方库的异步callbacks所做的更改,因为“它们不在zone中”。如果单击button,触发的事件不是浏览器的本机click事件,而是由handlerzone中运行的自定义(修补) click事件,因此handler知道其回调处理程序所做的更改。

但是,我无法理解在第三方回调中运行router.navigate()会造成这个问题(如 github问题所示)。Router不是角本身的service吗?为什么它在第三方zone中调用时不自动通知角的callback

我是在NGXS的状态减速器中使用router.navigate来解决这个问题的。

我的问题是:

可以有人解释我需要在什么时候用NgZone**?**包装代码

调试几个小时,并意识到我的代码超出了zone上下文,这是令人厌烦的。

EN

回答 3

Stack Overflow用户

发布于 2019-10-09 12:55:55

ngZone.runOutsideAngular() -这将运行角区域外的代码。

  • 当某个事件被触发时,它会告诉角检测变化。
  • 如果您使用的是mouseUp()或mouseDown()事件,那么在每次更改时,它都会告诉角来检测更改。
  • 如果我们不希望这些更改发生在角(这降低了应用程序的性能)运行时,我们可以在角区域之外运行它。
  • 与此形成对比的是,如果我们非常希望获得每个更新,那么我们可以使用ngZone.run()。意味着它将在正常情况下运行更改检测。

角本身使用遮罩下的ngZone检测变化()

所以,如果我们已经走出了角度区域,那么回来时我们使用ngZone.run()

票数 15
EN

Stack Overflow用户

发布于 2019-10-18 15:51:36

当单元测试您的路由时,ngZone.run()特别有用。

代码语言:javascript
复制
it('should redirect if condition true, fakeAsync(() => {
  router.navigate(['']);
  fixture.ngZone.run(() => {
    component.redirectIfConditionTrue();
  });
  tick();
  expect(location.path()).toBe('/AgentLeadsManager');
}));
  • 资料来源:这是我唯一一次不得不使用它
票数 8
EN

Stack Overflow用户

发布于 2019-10-18 17:18:35

Zone.js是一个用于跟踪和拦截异步操作的执行上下文,例如: DOM事件(clickkeydownkeyupetc)、setTimeoutsetInterval。( XMLHttpRequests)

NgZone只是围绕Zone.js的API的包装器服务。

角团队决定在执行上下文的过程中需要对其进行抽象,因此他们以角的形式构建了Zone.js和包装器(非正式适配器模式)。

因此,基本上是为了回答您的问题:在处理任何类型的第三方库时,这些库不与Zone.js中的answer的运行上下文相关联(除非您决定不需要执行上下文,并且可以使用NoopNgZone处理它)

来源

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51455545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档