我的角度项目中有一个bug,它最终通过将我的代码打包到
this.zone.run(() => {/* my code here */});正如这回答所述。
我以前对zone的理解是,angular不能检测第三方库的异步callbacks所做的更改,因为“它们不在zone中”。如果单击button,触发的事件不是浏览器的本机click事件,而是由handler在zone中运行的自定义(修补) click事件,因此handler知道其回调处理程序所做的更改。
但是,我无法理解在第三方回调中运行router.navigate()会造成这个问题(如这 github问题所示)。Router不是角本身的service吗?为什么它在第三方zone中调用时不自动通知角的callback?
我是在NGXS的状态减速器中使用router.navigate来解决这个问题的。
我的问题是:
可以有人解释我需要在什么时候用NgZone**?**包装代码
调试几个小时,并意识到我的代码超出了zone上下文,这是令人厌烦的。
发布于 2019-10-09 12:55:55
ngZone.runOutsideAngular() -这将运行角区域外的代码。
角本身使用遮罩下的ngZone检测变化()
所以,如果我们已经走出了角度区域,那么回来时我们使用ngZone.run()
发布于 2019-10-18 15:51:36
当单元测试您的路由时,ngZone.run()特别有用。
it('should redirect if condition true, fakeAsync(() => {
router.navigate(['']);
fixture.ngZone.run(() => {
component.redirectIfConditionTrue();
});
tick();
expect(location.path()).toBe('/AgentLeadsManager');
}));发布于 2019-10-18 17:18:35
Zone.js是一个用于跟踪和拦截异步操作的执行上下文,例如: DOM事件(
click、keydown、keyup、etc)、setTimeout、setInterval。(XMLHttpRequests)
NgZone只是围绕Zone.js的API的包装器服务。
角团队决定在执行上下文的过程中需要对其进行抽象,因此他们以角的形式构建了Zone.js和包装器(非正式适配器模式)。
因此,基本上是为了回答您的问题:在处理任何类型的第三方库时,这些库不与Zone.js中的answer的运行上下文相关联(除非您决定不需要执行上下文,并且可以使用NoopNgZone处理它)
https://stackoverflow.com/questions/51455545
复制相似问题