angular5动态组件解析器

时间:2018-04-05 09:36:39

标签: angular dependency-injection angular5 angular-aot angular6

我有多个模块,每个模块包含各种组件,以及需要包含其中一个组件的父组件。

由于我无法使用路由来实现这一点,因此我创建了一个服务,该服务给出moduleName :stringcompomnentName : string返回相应的组件类。

请参阅this stackblitz中的ComponentDirectoryService

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

  • 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');

1 个答案:

答案 0 :(得分:1)

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

这就是为什么你需要明确使用@Inject(<YOUR_INJECTION_TOKEN>)装饰器来指出:

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

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