2017-03-25 3 views
1

Ich habe eine Bibliothek mit dem Namen foo, die eine Winkelkomponente namens enthält FooContentComponent, die verschiedenen Arten von Inhalten macht:Render-Komponenten ohne explizite Abhängigkeit in ngModule

<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> 

Die FooContentComponent hat seine eigenen ngModule. In ähnlicher Weise lebt auch die FooMathComponent in ihrer eigenen .

Hier ist das Problem: i nicht wollen die FooMathModule im FooContentModule ausdrücklich importieren. Stattdessen möchte ich es der Anwendung überlassen, die foo-Bibliothek zu verwenden, um die FooMathModule einzuschließen, wenn die Anwendung mathematischen Inhalt rendern möchte. Wenn die Anwendung keine mathematischen Inhalte rendern möchte, importiert sie das FooMathModule nicht in ihrem App-Modul.

Wenn ich die FooMathModule innerhalb FooContentModule nicht importiere, erhalte ich einen Fehler vom Compiler, den es foo-math nicht kennt. Ich kann den Fehler loswerden, indem ich ein benutzerdefiniertes Schema in FooContentModule festlege, aber dann wird es immer noch nicht FooMathComponent rendern.

Kann ich das tun?

+0

können Sie das tun, da die FooMathComponent eine deklarative sein muss für Ihr Hauptmodul. – Aravind

Antwort

1

Sie können keine Submodule auf die Importe/Meldungen des App-Moduls ausrichten. Was Sie jedoch tun können, ist eine statische Methode wie z.B. Winkel Router hat seine 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; 
    } 

} 

und dann können Sie es in jedem Modul als

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

Hinweis verwenden, wenn Sie es mindestens einmal tun (zB in AppModule) überall verfügbar sein wird, so dass es wäre genug, nur FooContentModule hinterher zu importieren

+1

Cool, hatte nicht daran gedacht, danke! –

Verwandte Themen