我正在使用Angular 5来构建Web应用程序,并且想知道我是否可以重新初始化整个应用程序或使用类似的东西:
ApplicationRef.tick();
执行特定事件后发生的所有更改。事件是我的情况是身份验证令牌更新,因为由于某种原因,除非我在其中运行每个操作,否则我的应用程序的更改检测将开始中断
NgZone.run()
(如果有人感兴趣,我正在使用ADAL进行身份验证),但是当令牌更新(使用隐藏的iframe)时,应用程序更改检测,路由等开始中断。但是,刷新页面后,它会开始正常工作,直到下一次令牌过期,并且ADAL必须创建一个iFrame来更新令牌。因此,我在考虑是否至少可以在更新令牌后重新初始化应用程序,以便用户不必手动刷新应用程序(直到找到更可靠的解决方案为止)。
答案 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();
} );
}