Рендеринг компонентов без явной зависимости в ngModule

У меня есть библиотека под названием 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 ответ

Решение

Вы не можете ориентироваться на подмодули из импорта / объявлений / модуля / модуля приложения. Однако вы можете использовать статический метод, например, у Angular router 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 впоследствии

Другие вопросы по тегам