延迟加载的模块上的Angular 9路由器事件

时间:2020-07-09 15:19:23

标签: angular lazy-loading

我正在为Angular提供的Router.events奋斗。我的应用程序有两个延迟加载的模块。 每个都有一个导航菜单,其中显示一些链接以在应用程序内部导航。我希望我的链接之一显示为已选,具体取决于当前路线。

问题是,当我使用基于router.observable的observable的异步管道时,在我的模板由angular处理之前,路由事件已经发出。

我知道,如果我在组件的构造函数中手动订阅,则可以获取数据。如果我在ngOnInit函数中执行相同的操作(与使用异步管道相同),则不会发出任何数据。 如果在页面加载后使用链接导航,效果很好。

您知道我如何实现这一目标的方法吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我有人需要它,这就是我要解决的方法。如果您有延迟加载的模块,请确保在根组件上导入此服务,以便订阅在一开始就发生。

import {Injectable} from '@angular/core';
import {Observable, ReplaySubject} from 'rxjs';
import {filter, map, tap} from 'rxjs/operators';
import {NavigationEnd, Router} from '@angular/router';

@Injectable({
  providedIn: 'root'
})
export class RouterService {

  _events = new ReplaySubject<string>();

  constructor(private readonly router: Router) {
    router.events.pipe(
      filter(e => e instanceof NavigationEnd),
      map(e => e as NavigationEnd),
      map((e: NavigationEnd) => e.urlAfterRedirects),
      tap((url) => this._events.next(url))
    ).subscribe();
  }

  get events(): Observable<string> {
    return this._events.asObservable();
  }
}