2

我有多个模块,每个模块都包含各种组件,以及需要包含这些组件之一的父组件。

由于我无法使用路由来实现这一点,因此我编写了一个服务,它给出了 amoduleName :string和 acompomnentName : string返回相应的组件类。

请参阅此 stackblitzComponentDirectoryService

我模仿路由器模块如何允许功能模块注入自己的路由:

  • ComponentDirectoryModule有一个值被传递到forRootforChild方法DIRECTORY_ENTRIES
  • 每个功能模块(stackblitz 中的 p1 和 p2)调用forChild以提供其DIRECTORY_ENTRIES
  • AppModule 调用forRoot,它提供ComponentDirectoryService传入的累积(调用forChild)值DIRECTORY_ENTRIES

在开发模式下一切正常。

在生产模式下一切正常,但我收到了这个可怕的警告:

无法解析 ...component-directory.service.ts: (?) 中 ComponentDirectoryService 的所有参数。这将成为 Angular v6.x 中的错误

令我困惑的是,服务的唯一参数是目录条目......

编辑 1

就像 Angular 声明 ROUTES 注入令牌一样:

export const ROUTES = new InjectionToken<Route[][]>('ROUTES');

我对 DIRECTORY_ENTRIES 也是如此:

export const DIRECTORY_ENTRIES = new InjectionToken<ComponentDirectoryEntry[][]>('DIRECTORY_ENTRIES');

4

1 回答 1

1

编译器错过了有关应该实际注入服务的信息。

这就是为什么您需要显式使用@Inject(<YOUR_INJECTION_TOKEN>)装饰器来指出这一点:

constructor(@Inject(DIRECTORY_ENTRIES) private entries: ComponentDirectoryEntry[]) { }

这将在内部将元数据标志设置为属性entries,并且使用此元数据 Angular 将知道DIRECTORY_ENTRIES应该在此处注入。

于 2018-04-05T12:31:50.793 回答