angular5动态分量分解器

angular5动态分量分解器,angular,dependency-injection,angular5,angular-aot,angular6,Angular,Dependency Injection,Angular5,Angular Aot,Angular6,我有多个模块,每个模块都包含各种组件,还有一个父组件需要包含其中一个组件 由于我无法使用路由来实现这一点,因此我编写了一个服务,该服务给定一个moduleName:string,一个componentname:string返回相应的组件类 请参阅中的ComponentDirectoryService 我在模仿路由器模块如何允许功能模块注入自己的路由: ComponentDirectoryModule有一个forRoot和forChild方法,向这些方法传递目录项值 每个功能模块(stackbl

我有多个模块,每个模块都包含各种组件,还有一个父组件需要包含其中一个组件

由于我无法使用路由来实现这一点,因此我编写了一个服务,该服务给定一个
moduleName:string
,一个
componentname:string
返回相应的组件类

请参阅中的
ComponentDirectoryService

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

  • ComponentDirectoryModule
    有一个
    forRoot
    forChild
    方法,向这些方法传递
    目录项
  • 每个功能模块(stackblitz中的p1和p2)调用
    forChild
    以提供其
    目录\u条目
  • AppModule调用
    forRoot
    ,它提供
    ComponentDirectoryService
    传递
    目录项的累积值(调用
    forChild
在开发模式下一切正常

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

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

让我困惑的是,服务的唯一参数是目录项

编辑1

与路由注入令牌类似:

export const ROUTES=new InjectionToken('ROUTES')

我对目录_条目也是如此:


export const DIRECTORY_ENTRIES=new InjectionToken('DIRECTORY_ENTRIES')

编译器遗漏了关于应该实际注入到服务中的内容的信息

这就是为什么需要显式使用
@Inject()
decorator指出:

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

这将在内部将元数据标志设置为属性
entries
,使用此元数据将知道应该在此处注入
DIRECTORY\u entries

看起来发生这种情况是因为使用数组作为注入对象,这可能是问题的原因,因为AoT试图找到负责的类对于那个令牌,它失败了。可能值得尝试使用显式insteadHello,我不确定我是否理解显式注入令牌的含义;我用如何声明令牌和路由器的意思更新了这个问题:在构造函数中尝试使用
Inject()
constructor(@Inject(DIRECTORY\u ENTRIES)private ENTRIES:ComponentDirectoryEntry[]){}