router.navigate 后未调用 ngOnInit
ngOnInit not being called after router.navigate
我的 Angular 应用程序突然没有在 router.navigation()
之后调用 ngOnInit()
,这意味着我的组件无法正确加载。我认为这可能是由于我进行了一些更改,但恢复更改并没有解决问题。
正常导航导致组件无法正确加载的示例;通过以下代码清单导航到此页面:
this.router.navigate(['/result', this.params.data._id]);
:
正在重新加载页面,组件已正确加载:
这是我的一些代码清单,
app.module.ts
@NgModule({
imports: [
BrowserModule,
FormsModule,
AppRoutingModule,
AgGridModule.withComponents(
[SampleResultButtonComponent]
),
ChartsModule
],
declarations: [
AppComponent,
LoginComponent,
LogoutComponent,
SignupComponent,
FilesComponent,
NavbarComponent,
ProfileComponent,
UploadComponent,
SampleGridApplicationComponent,
SampleResultButtonComponent,
AssetGridApplicationComponent,
ResultComponent,
ResetPasswordComponent,
AssetComponentDetailComponent
],
bootstrap: [ AppComponent ],
entryComponents: [AssetComponentDetailComponent]
})
export class AppModule {}
app-routing.module.ts
@Injectable()
export class NoAuthGuard implements CanActivate {
constructor(private router: Router) {}
canActivate() {
const activeUser = Kinvey.User.getActiveUser();
if (activeUser) {
return true;
}
// Navigate to the login page
this.router.navigate(['/login']);
return false;
}
}
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private router: Router) {}
canActivate() {
const activeUser = Kinvey.User.getActiveUser();
console.log("AuthGuard, CanActivate");
if (!activeUser) {
return true;
}
// Navigate to the main page
this.router.navigate(['']);
return false;
}
}
const appRoutes: Routes = [
{
path: '',
component: NavbarComponent,
canActivate: [NoAuthGuard],
children: [
{ path: '', component: SampleGridApplicationComponent },
{ path: 'files', component: FilesComponent },
{ path: 'upload', component: UploadComponent },
{ path: 'profile', component: ProfileComponent },
{ path: 'sampleitems', component: SampleGridApplicationComponent },
{ path: 'assetitems', component: AssetGridApplicationComponent },
{ path: 'result/:id', component: ResultComponent}
]
},
{ path: 'login', component: LoginComponent, canActivate: [AuthGuard] },
{ path: 'logout', component: LogoutComponent },
{ path: 'signup', component: SignupComponent, canActivate: [AuthGuard] },
{ path: 'reset', component: ResetPasswordComponent, canActivate: [AuthGuard] }
];
@NgModule({
imports: [
RouterModule.forRoot(appRoutes, {useHash: true})
],
exports: [
RouterModule
],
providers: [
AuthGuard,
NoAuthGuard
]
})
export class AppRoutingModule {}
编辑
经过更多挖掘后,我认为该问题与问题 here 有关,但建议的修复无法解决此问题。
问题最终成为 angular 路由器中的一个错误,降级到版本 4.1.3 解决了这个问题。希望这对尝试使用最新版本 angular 和 Kinvey SDK 的其他人有所帮助。
看来这个问题还是存在的,即使5.0已经发布了,至少https://github.com/angular/angular/issues/18254的问题还没有解决。好消息是问题中描述了一个解决方法,使用:
this.zone.run(() => {
this.router.navigateByUrl( url );
});
我在 Firebase 的 onAuthStateChanged 回调中遇到问题,上述解决方法有所帮助。
我的 Angular 应用程序突然没有在 router.navigation()
之后调用 ngOnInit()
,这意味着我的组件无法正确加载。我认为这可能是由于我进行了一些更改,但恢复更改并没有解决问题。
正常导航导致组件无法正确加载的示例;通过以下代码清单导航到此页面:
this.router.navigate(['/result', this.params.data._id]);
:
正在重新加载页面,组件已正确加载:
这是我的一些代码清单,
app.module.ts
@NgModule({
imports: [
BrowserModule,
FormsModule,
AppRoutingModule,
AgGridModule.withComponents(
[SampleResultButtonComponent]
),
ChartsModule
],
declarations: [
AppComponent,
LoginComponent,
LogoutComponent,
SignupComponent,
FilesComponent,
NavbarComponent,
ProfileComponent,
UploadComponent,
SampleGridApplicationComponent,
SampleResultButtonComponent,
AssetGridApplicationComponent,
ResultComponent,
ResetPasswordComponent,
AssetComponentDetailComponent
],
bootstrap: [ AppComponent ],
entryComponents: [AssetComponentDetailComponent]
})
export class AppModule {}
app-routing.module.ts
@Injectable()
export class NoAuthGuard implements CanActivate {
constructor(private router: Router) {}
canActivate() {
const activeUser = Kinvey.User.getActiveUser();
if (activeUser) {
return true;
}
// Navigate to the login page
this.router.navigate(['/login']);
return false;
}
}
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private router: Router) {}
canActivate() {
const activeUser = Kinvey.User.getActiveUser();
console.log("AuthGuard, CanActivate");
if (!activeUser) {
return true;
}
// Navigate to the main page
this.router.navigate(['']);
return false;
}
}
const appRoutes: Routes = [
{
path: '',
component: NavbarComponent,
canActivate: [NoAuthGuard],
children: [
{ path: '', component: SampleGridApplicationComponent },
{ path: 'files', component: FilesComponent },
{ path: 'upload', component: UploadComponent },
{ path: 'profile', component: ProfileComponent },
{ path: 'sampleitems', component: SampleGridApplicationComponent },
{ path: 'assetitems', component: AssetGridApplicationComponent },
{ path: 'result/:id', component: ResultComponent}
]
},
{ path: 'login', component: LoginComponent, canActivate: [AuthGuard] },
{ path: 'logout', component: LogoutComponent },
{ path: 'signup', component: SignupComponent, canActivate: [AuthGuard] },
{ path: 'reset', component: ResetPasswordComponent, canActivate: [AuthGuard] }
];
@NgModule({
imports: [
RouterModule.forRoot(appRoutes, {useHash: true})
],
exports: [
RouterModule
],
providers: [
AuthGuard,
NoAuthGuard
]
})
export class AppRoutingModule {}
编辑 经过更多挖掘后,我认为该问题与问题 here 有关,但建议的修复无法解决此问题。
问题最终成为 angular 路由器中的一个错误,降级到版本 4.1.3 解决了这个问题。希望这对尝试使用最新版本 angular 和 Kinvey SDK 的其他人有所帮助。
看来这个问题还是存在的,即使5.0已经发布了,至少https://github.com/angular/angular/issues/18254的问题还没有解决。好消息是问题中描述了一个解决方法,使用:
this.zone.run(() => {
this.router.navigateByUrl( url );
});
我在 Firebase 的 onAuthStateChanged 回调中遇到问题,上述解决方法有所帮助。