延迟加载模块不使用单例

时间:2016-12-29 22:07:09

标签: angular angular2-routing

我有一个懒惰加载另一个模块的根模块。在这个延迟加载的模块中,路由有一个试图加载一些外部数据的解析器。如果失败,则会在其自身中存储错误消息,并导航到错误组件。错误组件已注入解析器,然后应显示解析程序的错误消息。

我通过以下方式调整了官方的Angular 2英雄之旅:

  • app/crisis-center/crisis-detail-resolver.service.ts - 修改为始终设置errorMessage字段,然后导航至ErrorComponent。之前导航到/crisis-center命令。
  • app/crisis-center/error.component.ts - 新添加。将CrisisDetailResolver作为依赖项,并显示errorMessage

如果crisis-center.module.ts延迟加载,则注入ErrorComponent的解析器与路由器中使用的解析器不同。我只能通过调试时解析器中没有errorMessage来确认这一点。您可以点击危机中心下的任何危机,在plnkr上看到这一点。您将看不到显示的错误消息。

如果模块没有延迟加载(即我在根模块中显式加载),解析器现在是一个单例,我有错误消息显示在ErrorComponent中。您可以点击危机中心下的任何危机,在plnkr上看到这一点。您将看到显示的错误消息。

我很困惑为什么这不起作用,据我所知,CrisisDetailResolver被声明为app/crisis-center/crisis-center-routing.module.ts的提供程序块中的单例。

2 个答案:

答案 0 :(得分:1)

如果有人遇到这个问题,我发现我的问题是由Angular中的问题引起的,应尽快解决。

问题是当前版本如果Angular 2(2.4.1)将为每个导航创建一个新模块(并因此创建一个新的注入器)。这就是为什么我的提供者不被保留为单身人士的原因。

我提出的GitHub问题可以在这里找到,并且包含对问题的更深入的解释:https://github.com/angular/angular/issues/13722

答案 1 :(得分:0)

根据文档,延迟加载模块的提供程序是模块范围的。看起来像你的情况:https://angular.io/docs/ts/latest/cookbook/ngmodule-faq.html#!#q-lazy-loaded-module-provider-visibility