您可以订阅 RouterEvents 以了解何时开始完成路线导航。您还需要在路由器插座之外的 AppComponent 中的加载器组件和显示/隐藏加载器的标志。您可以使用 LoaderService 控制整个应用程序的加载程序可见性。
加载服务
export class LoaderService {
isLoaderShown = new BehaviorSubject<boolean>(false);
constructor() { }
public showLoader() {
this.isLoaderShown.next(true);
}
public hideLoader() {
this.isLoaderShown.next(false);
}
}
您可以使用此 LoaderService 从应用程序的任何位置显示或隐藏加载程序。
更新您的 AppComponent 以添加新的加载器组件。LoaderComponent 只需要包含您选择的加载器。
<app-header></app-header>
<app-loader *ngIf="showLoader"></app-loader>
<router-outlet></router-outlet>
<app-footer></app-footer>
现在我们可以使用showLoader
AppComponent 中的标志来控制加载器的显示。
应用组件
export class AppComponent implements OnInit {
showLoader = false;
constructor(
private loaderService: LoaderService,
private router: Router
) { }
ngOnInit() {
this.loaderService.isLoaderShown.subscribe(isLoaderShown => this.showLoader = isLoaderShown);
this.router.events.subscribe(routerEvent => {
if (routerEvent instanceof NavigationStart) {
this.loaderService.showLoader();
} else if (routerEvent instanceof NavigationEnd) {
this.loaderService.hideLoader();
} else if (routerEvent instanceof NavigationCancel) {
this.loaderService.hideLoader();
// Handle cancel
} else if (routerEvent instanceof NavigationError) {
this.loaderService.hideLoader();
// Handle error
}
});
}
}
现在,每当路由器导航开始时,我们都会显示加载器并在导航结束时隐藏。但是,这并未考虑 API 加载时间。为此,您可以this.loaderService.hideLoader();
从 中删除NavigationEnd
并将其添加到您的 API 调用订阅中。这就是我们将其添加为服务的原因。您可以将其注入您的 API 服务并隐藏加载程序。
this.httpClient.get(url).subscribe(result => {
// Perform operations with the result
this.loaderService.hideLoader();
});
因此,loader 将在导航开始时显示,并且当 API 调用结果在服务中可用时,loader 可以隐藏。