angular - Angular 5 - 加载器服务不工作。
问题描述
我需要为我的 Angular 5 应用程序创建一个服务,该服务将在路由器加载页面时显示一个加载器。到目前为止,这是我想出的:
@Injectable()
export class LoaderService {
public loaderShown$ = new BehaviorSubject<boolean>(false);
constructor(public router: Router, private ngZone: NgZone, public logger: LoggerService) {
router.events.subscribe((event: RouterEvent) => {
this.interceptNavigation(event)
})
}
public toggle(visible: boolean) {
//this.ngZone.runOutsideAngular(() => {
console.log('toggled ' + visible);
this.loaderShown$.next(visible);
//});
}
private interceptNavigation(event: RouterEvent) {
if (event instanceof NavigationStart) {
this.toggle(true);
}
if (event instanceof NavigationEnd) {
this.toggle(false);
}
if (event instanceof NavigationCancel) {
this.toggle(false);
}
if (event instanceof NavigationError) {
this.toggle(false);
}
}
}
在 app.component 我订阅了服务:
this.loaderService.loaderShown$.subscribe(shown => {
this.loaderShown = shown;
}, (err) => console.log(err));
它就像一个魅力。但是,当我尝试在组件中调用 LoaderService 的切换方法时,它什么也没做 - 值没有广播。订阅好像被取消了。但是当我导航到另一个页面时,它又可以工作了(这很奇怪)。你知道如何解决这个问题吗?
解决方案
问题在于 Angular 在我的延迟加载结构中没有将服务视为单例。我已经能够通过更新服务所在的模块来解决这个问题,然后在 AppModule 中将其定义为 forRoot()。这确保了服务是单例的。
推荐阅读
- c# - 是否有有效的算术捷径可用于优化点云的过滤?
- node.js - 在这种情况下使用 GET 而不是 POST 的原因是什么?
- html - snapchat的标签是什么?
- go - 当我使用客户端去 kubernetes 监视列表时的一些问题
- reactjs - 是否可以延迟组件在 React 中被销毁?
- css - 将元素水平居中特定断点及以下
- python - 改善 pyopencv (cv2.Canny) 中较差的边缘检测结果
- php - 如何将 PHP 关联数组转换为 json 数组
- django - Django对其模型的看法与实际数据库不一致
- firebase - 缺少必要的权限 resourcemanager.projects.getIamPolicy