代码之家  ›  专栏  ›  技术社区  ›  Branislav B.

角度5-装载机服务不工作。

  •  1
  • Branislav B.  · 技术社区  · 8 年前

    我需要为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);
        }
    } 
    }
    

    在应用程序中。我正在订阅服务的组件:

    this.loaderService.loaderShown$.subscribe(shown => {
        this.loaderShown = shown; 
      }, (err) => console.log(err));
    

    它就像一个符咒。然而,当我试图在组件中调用LoaderService的toggle方法时,它什么都不做——该值不在广播中。看起来订阅被取消了。但当我导航到另一个页面时,它又能工作了(这很奇怪)。你知道如何解决这个问题吗?

    1 回复  |  直到 8 年前
        1
  •  0
  •   Branislav B.    8 年前

    问题在于,在我的延迟加载结构中,Angular没有将服务视为一个单独的组件。通过更新服务所在的te模块,然后在AppModule中将其定义为forRoot(),我已经能够解决这个问题。这确保了该服务是单例的。

    推荐文章