在特定事件上重新初始化Angular应用程序:Angular 5

时间:2018-10-29 18:32:28

标签: javascript angular

我正在使用Angular 5来构建Web应用程序,并且想知道我是否可以重新初始化整个应用程序或使用类似的东西:

ApplicationRef.tick();

执行特定事件后发生的所有更改。事件是我的情况是身份验证令牌更新,因为由于某种原因,除非我在其中运行每个操作,否则我的应用程序的更改检测将开始中断

NgZone.run()

(如果有人感兴趣,我正在使用ADAL进行身份验证),但是当令牌更新(使用隐藏的iframe)时,应用程序更改检测,路由等开始中断。但是,刷新页面后,它会开始正常工作,直到下一次令牌过期,并且ADAL必须创建一个iFrame来更新令牌。因此,我在考虑是否至少可以在更新令牌后重新初始化应用程序,以便用户不必手动刷新应用程序(直到找到更可靠的解决方案为止)。

2 个答案:

答案 0 :(得分:0)

如果您要调用任何第三方API或执行第三方库代码,则这是强制性的。我们需要手动调用ngzone.run(),它将在内部调用ApplicationRef.tick()来通知angular以执行从应用程序根组件到子组件(即整个应用程序)的更改检测。

ngZone.run(()=>{
  // Adal callback Function
});

如果仅需要触发对当前组件及其子组件(而不是整个应用程序)的更改检测。您可以使用任何一个选项。

1) setTimeout(()=>{}, 0);

2) this.cdr.detectChanges();

3) For Components with OnPush Change Detection Stratergy, you can call this.cdr.markForCheck() inside setTimeout();

   setTimeout(()=>{
     this.cdr.markForCheck();
   }, 0);

答案 1 :(得分:0)

您可以像下面这样明确地调用更改检测。

 constructor(private changeDetector: ChangeDetectorRef) {

    this.someEvents.subscribe((data) => {

    this.changeDetector.detectChanges();
   } );
}

https://angular.io/api/core/ChangeDetectorRef