【问题标题】:Listen to multiple routers监听多个路由器
【发布时间】:2018-05-02 22:00:01
【问题描述】:

我有一个带有子模块和子路由的应用程序。 我需要安装一个服务来响应每一个路由器的变化。

我的问题是我找不到初始化它的方法。 Angular 模块没有 NgOnInit,我可以在其中传递路由器对象,RouterModule 也没有。

除非我在每个组件中将路由器传递给我的服务,否则我不知道如何解决这个问题。

另一个想法是使用守卫来设置路由器,但这似乎很脏,因为这不是守卫的用途。

【问题讨论】:

    标签: angular angular-routing


    【解决方案1】:

    你不能在主组件中(通常在 app.component.ts 中)注入路由器,然后订阅它的事件吗?

    export class AppComponent {
       constructor(private router: Router) {}
    
       ngOnInit() {
          this.router.events.subscribe( event => {
            //here you will have an event, such as NavigatiunStart, NavigationEnd, etc...
          })
       }
    }
    

    【讨论】:

    • 同样的想法:) toddmotto.com/…
    • 我必须在每个模块的每个主要组件中都这样做。但它应该工作是的。我希望在你的配置中做到这一点。如果没有更好的答案出现,我猜这将是我的解决方案:-(
    • 否 @AndreschSerj 您不需要在每个组件中都这样做。 'this.router.events' 是一个 onservable,它将“观察”每个路由器的变化(路由器的变化会发出一个事件流)。
    • 不,不是在每个组件中,而是在每个主要组件中,所以每个模块一次并且我拥有的模块数量仍然不是我希望的理想解决方案。但可能仍然是唯一的一个 :-( 谢谢你的时间和帮助你
    【解决方案2】:

    拥有一个路由服务RouteService,它监听路由变化并采取相应的行动。 将此RouteService 注入app.component.ts。 不要忘记在app.module.ts提供服务。

    因为会有这个服务的单一实例。您可以使用它来挂钩路线更改

    @Injectable()
    export class RouteService {
    constructor(public router: Router) {
        // this.initialize();  // You can initialize from here or from app component
    }
    
    initialize() {
        this.router.events.filter((event) => event instanceof NavigationEnd).subscribe((event: any) => {
            this.onRouteChange(event);
        });
    }
    onRouteChange() {
       // Handle route change.
    }
    }
    

    注入app.component.ts

    @Component({
      selector: "app-root",
      templateUrl: "./app.component.html",
      styleUrls: ["./app.component.scss"]
    })
    export class AppComponent implements OnInit {
       constructor(
           public routeService: RouteService) {
       }
       ngOnInit(): void {
        this.routeService.initialize(); // Intitialize here.
      }
    }
    

    【讨论】:

    • 正如我在问题中所说,这是我不想做的,因为我必须将此服务添加到每个组件中。那是太多的代码重复,难以维护且丑陋。
    • 您不必在每个组件中都注入它。只要它被注入到 app.component 中,它就会在应用程序加载后立即初始化(通过 initialize()),然后订阅将处理每个路由器的更改。
    • @andresch-serj。正如@ChristianBenseler 所说,您只需在app.component.ts 中注入此服务一次并在那里处理路由。
    • @BasavarajBhusani 的解决方案与我的相同,不同之处在于他已将逻辑移至将要注入的服务(然后如果您想重用它,会更简单)。但思路是一样的:在主组件中订阅路由器事件,路由器发出的事件流会被订阅者“监听”。
    猜你喜欢
    • 1970-01-01
    • 2020-05-07
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多