在ngModule中呈现没有显式依赖关系的组件

时间:2017-03-25 09:15:28

标签: angular angular4 ng-modules

我有一个名为foo的库,其中包含一个名为FooContentComponent的角度组件,可呈现各种类型的内容:

<ng-container *ngFor="let item of contents">
  <ng-container *ngIf="item.type === 'text'">{{item.text}}</ng-container>
  <ng-container *ngIf="item.type === 'math'">
    <foo-math [formula]="item.formula"></foo-math>
  </ng-continer>
</ng-container>

FooContentComponent有自己的ngModule。同样地,FooMathComponent也存在于其自己的ngModule

问题在于:我希望明确导入FooMathModule中的FooContentModule。相反,如果应用程序想要呈现数学内容,我想使用foo库将其留给应用程序以包含FooMathModule。如果应用程序不想呈现数学内容,则不会在其应用模块中导入FooMathModule

如果我不在FooMathModule内导入FooContentModule,我会从编译器收到错误,它不知道foo-math。我可以通过在FooContentModule中指定自定义架构来消除错误,但它仍然无法呈现FooMathComponent

我可以这样做吗?

1 个答案:

答案 0 :(得分:1)

您无法从应用程序模块的导入/声明/目标中定位子模块。然而,你可以做的是使用静态方法,例如Angular路由器有forRoot()

let imports = [standard imports here];

@NgModule({
  imports
})
export FooContentModule {
  // or call it forRoot if you want
  public static withAdditionalImports(additionalImports: any[]) {
    imports.push.apply(imports, additionalImports);

    return FooContentModule;
  }

}

然后你可以在任何模块中使用它

@NgModule({
  imports: [
    FooContentModule.withAdditionalImports(FooMathModule)
  ]
})
export AnyModule {}

请注意,如果您至少执行一次(例如在AppModule中),它将在任何地方都可用,因此仅在之后导入FooContentModule就足够了