表达式ChangedTerrithasBeenCheckedError与Angular 6和redirect
我可以看到有很多关于这个主题的帖子,但大部分都与异步服务调用有关。我有一个应用程序组件,负责登录Azure AD。当用户单击登录时,他们将重定向到Azure的登录页面,并重定向回名为AuthCallBack的组件。AuthCallBack将调用AppComponenet上的一个方法,该方法只设置一个名为userIsLoggedIn的布尔值,我在ngIf中使用它。我得到以下错误表达式ChangedTerithasBeenCheckedError。因为它不是某种http异步调用,所以我没有Subscribe选项,该怎么办表达式ChangedTerrithasBeenCheckedError与Angular 6和redirect,angular,Angular,我可以看到有很多关于这个主题的帖子,但大部分都与异步服务调用有关。我有一个应用程序组件,负责登录Azure AD。当用户单击登录时,他们将重定向到Azure的登录页面,并重定向回名为AuthCallBack的组件。AuthCallBack将调用AppComponenet上的一个方法,该方法只设置一个名为userIsLoggedIn的布尔值,我在ngIf中使用它。我得到以下错误表达式ChangedTerithasBeenCheckedError。因为它不是某种http异步调用,所以我没有Subsc
<table>
<tr>
<td routerLink="/">Login page</td>
<td routerLink="/dashboard">Dashboard</td>
<td (click)="login()">Login</td>
<td (click)="logout()">Logout</td>
<td><span *ngIf="userIsLoggedIn">Logged in</span></td>
</tr>
<tr>
<td colspan="5">
<router-outlet></router-outlet>
</td>
</tr>
</table>
父组件(appComponent)已具有CD(更改检测)周期,而不是子组件更改父组件的状态。在开发模式下-另一张CD过来,检查上一个CD周期没有任何更改(将抛出错误)
我们有一个黑客:
-换行设置超时,更改将应用于新的CD周期
// AuthComponent
setTimeout(()=>this.appComponent.handleWindowCallback(), 0);
-在父组件中调用ChangeDetectorRef.检测更改
// AppComponent
constructor(private changeDetectorRef: ChangeDetectorRef){}
handleWindowCallback(){
/* some code */
this.changeDetectorRef.detectChanges();
}
谢谢,我会尽快测试的。为什么要暂停?不客气。但不要过度使用,因为我们会触发额外的CD周期,这会影响性能。
// AuthComponent
setTimeout(()=>this.appComponent.handleWindowCallback(), 0);
// AppComponent
constructor(private changeDetectorRef: ChangeDetectorRef){}
handleWindowCallback(){
/* some code */
this.changeDetectorRef.detectChanges();
}