【问题标题】:Angular 9 router events on lazy loaded module延迟加载模块上的 Angular 9 路由器事件
【发布时间】:2020-10-30 05:55:40
【问题描述】:

我正在为 Angular 提供的 Router.events 可观察对象而苦苦挣扎。我的应用程序有两个延迟加载的模块。 每个都有一个导航菜单,显示一些链接以在应用程序内导航。我希望我的一个链接根据当前路线显示为选中状态。

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

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

您知道如何实现这一目标吗?

谢谢!

【问题讨论】:

  • 您需要监听事件变化,还是只需要能够获取当前值?即使用 ActivatedRoute 将获得当前值,而无需订阅所有路由器事件
  • 嗨,我需要监听事件变化,因为我的显示链接的组件只构建了一次。谢谢
  • 请提供您对 ngoninit 和订阅的代码,以便社区可以评论,如果适用
  • 我有人需要它,这就是我修复它的方法。如果您有延迟加载的模块,请确保在根组件上导入此服务,以便订阅发生在最开始。

标签: angular lazy-loading


【解决方案1】:

我有人需要它,这就是我修复它的方法。如果您有延迟加载的模块,请确保在根组件上导入此服务,以便在最开始时进行订阅。

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();
  }
}

【讨论】:

  • 感谢您的解决方案。但是,当我实现我的时,我只是发送了所有事件而不是一个属性(也没有过滤)。我永远不知道什么时候我会在另一个地方需要别的东西。我只是留下我的RouterService 作为Router 的可注射替代品。 (需要因为使用延迟加载的模块。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-01
  • 1970-01-01
  • 2018-05-22
  • 2023-01-19
  • 2017-08-21
  • 1970-01-01
  • 2017-05-17
相关资源
最近更新 更多