Angular 全局微调器不显示路由事件
我的应用程序组件HTML中有此代码Angular 全局微调器不显示路由事件,angular,routes,spinner,Angular,Routes,Spinner,我的应用程序组件HTML中有此代码 <mat-progress-spinner *ngIf="loading"></mat-progress-spinner> <router-outlet></router-outlet> 我和Deborah Kurata一起学习了这项技术。但我从来没有看到过旋转器,在加载页面时,我的应用程序中有很多图像。我做错了什么?有什么想法吗 编辑: 使用onPush changedetection,图
<mat-progress-spinner *ngIf="loading"></mat-progress-spinner>
<router-outlet></router-outlet>
我和Deborah Kurata一起学习了这项技术。但我从来没有看到过旋转器,在加载页面时,我的应用程序中有很多图像。我做错了什么?有什么想法吗
编辑:
使用onPush changedetection,图像不会出现,所以我有点迷路了
编辑:
应用程序路由:
//const adminModule = ()=> import('./admin/admin.module').then(m=>m.AdminModule);
const routes: Routes = [
{
path: '', component:ShellComponent,
children: [
{path: 'home', component: HomeComponent, canActivate:[AuthGuardService] },
//{path: 'admin', loadChildren: adminModule},
{path: 'detail/:id', component: DetailComponent, },
{path: '', redirectTo:'home', pathMatch:'full'},
{path: 'table', component:ListBooksComponent},
{path: 'selection', component: SelectionComponent, },
{path:'edit/:id', component:RegisterComponent, canDeactivate:[EditGuardService]},
]
},
{path: 'login', component: LoginComponent},
{path:'edit/:id', component:RegisterComponent},
{path:'register', component: RegisterComponent}
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
首先,图像加载不会停止导航,也不是导航生命周期的一部分 您是否碰巧在应用程序组件中使用了
ChangeDetectionStrategy.OnPush
?如果是这样的话,一种方法就是让它成为一个可观察的。哪种解决方案更清洁:
<mat-progress-spinner *ngIf="loading$ | async"></mat-progress-spinner>
<router-outlet></router-outlet>
导出类AppComponent{
只读加载$:可观=this.router.events.pipe(
映射((事件)=>this.checkRouterEvent(事件))
);
构造函数(专用路由器:路由器){}
checkRouterEvent(routerEvent:Event):布尔值{
if(导航启动的路由事件实例){
返回true;
}
如果(路由事件实例)导航取消||
导航结束的路由事件实例||
路由事件实例(导航错误){
返回false;
}
}
}
但是,请记住,如果路由器有一些解析/保护/加载工作要做,那么您将能够实际看到微调器的唯一方法。这基本上意味着:
解析:这些在您导航到的路径上声明。如果这些是异步的,比如http调用,那么在解析过程中会显示微调器
守卫:这些是在你的路线配置上的,和鲜为人知的守卫。这里的计数相同,如果这些是异步的,则将有一个微调器
加载:这是您的功能模块的第一步。这是使用配置文件定义的路径。当应用程序请求模块时,它将延迟路由器加载的时间
如果您的route config没有这三项功能中的任何一项,或者它们不是异步的,您将不会看到微调器首先,图像加载不会停止导航,并且不属于导航生命周期的一部分。您是否在应用程序组件中使用了ChangeDetectionStrategy.OnPush
?不,我使用的是默认的,但我可以尝试您的建议OK,谢谢您的完整答案,我会尝试使用您的代码返回(我将其替换为我的代码)。我收到以下错误:类型“Observable”不可分配给类型“Observable”。类型“void”不能分配给类型“boolean”
我也理解视频中的逻辑,但我的实现没有work@Mellville我错误地复制了您的checkRouterEvent
。我没有更改此方法的返回类型。我已经更新了我的答案。你确定你有我在你的路线配置中提到的三件事中的任何一件吗。你能发布你的路线配置吗?另外,您是否可以通过测试
或不使用*ngIf
进行检查,以查看是否确实可以看到某些内容。对于最近的评论,我深表歉意。我会试试那个解决办法
//const adminModule = ()=> import('./admin/admin.module').then(m=>m.AdminModule);
const routes: Routes = [
{
path: '', component:ShellComponent,
children: [
{path: 'home', component: HomeComponent, canActivate:[AuthGuardService] },
//{path: 'admin', loadChildren: adminModule},
{path: 'detail/:id', component: DetailComponent, },
{path: '', redirectTo:'home', pathMatch:'full'},
{path: 'table', component:ListBooksComponent},
{path: 'selection', component: SelectionComponent, },
{path:'edit/:id', component:RegisterComponent, canDeactivate:[EditGuardService]},
]
},
{path: 'login', component: LoginComponent},
{path:'edit/:id', component:RegisterComponent},
{path:'register', component: RegisterComponent}
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
<mat-progress-spinner *ngIf="loading$ | async"></mat-progress-spinner>
<router-outlet></router-outlet>
export class AppComponent {
readonly loading$: Observable<boolean> = this.router.events.pipe(
map((event) => this.checkRouterEvent(event))
);
constructor(private router: Router) {}
checkRouterEvent(routerEvent: Event): boolean {
if (routerEvent instanceof NavigationStart) {
return true;
}
if (routerEvent instanceof NavigationCancel ||
routerEvent instanceof NavigationEnd ||
routerEvent instanceof NavigationError) {
return false;
}
}
}