2016-06-09 7 views
1

Ich arbeite an einem Projekt, wo ich eine andere Vorlage/Komponente basierend auf meiner Endpunktantwort anzeigen muss.Ich möchte verschiedene Komponenten basierend auf unterschiedlichen Endpunktdaten in Angular 2 anzeigen

Zum Beispiel

{data: {type: 1, textToDisplay: 'I want beans'} } 

Sollte Komponente 1 in die Haupt App-Vorlage injizieren.

Wenn die Daten

{data: {type: 2, textToDisplay: 'I want cheese', numberToDisplay: '101' } } 

Komponente injizieren Sollten 2 in die Haupt App-Vorlage und natürlich Komponente 2 würde 1 bis Komponente unterschiedlich sein, weil es zusätzliche Eigenschaften.

Ich möchte wirklich nicht schlechte Praxis durch Anhängen von Elementen in die Haupt-App-Vorlage noch möchte ich eine massive Vorlage mit [if] Direktiven schreiben, wie wir viele, 5-8, verschiedene Komponenten zu rendern und es haben könnten würde die Vorlage aufblähen.

Was ist ein geeigneter Weg?

+0

Vielleicht etwas wie http://stackoverflow.com/questi on ons/36325212/angular-2-dynamic-tabs-mit-user-click-selected-components/36325468 # 36325468 –

Antwort

2

Wie @ Günter erwähnt, können Sie DynamicComponentLoader

@Component({ 
    selector: 'my-app', 
    template: `<button (click)="addCmp()" #theBody>add</button> 
    `, 
    directives: [BaseDynamicComponent] 
}) 
export class AppComponent { 
    @ViewChild('theBody', {read: ViewContainerRef}) theBody; 
    cmp:ComponentRef; 

    constructor(injector: Injector,private resolver: ComponentResolver) {} 

    addCmp(data){ 
    console.log('adding'); 
    this.resolver.resolveComponent(BaseDynamicComponent).then((factory:ComponentFactory<any>) => { 
     this.cmp = this.theBody.createComponent(factory); 
     //and you can set your BaseDynamicComponent's 'extra' properties here 
     this.cmp.instance.numberToDisplay = data.numberToDisplay; 
    }); 
    } 
    } 

Dies wird fügen Sie die BaseDynamicComponent unter dem #theBody Element verwenden.

Hier ist ein Beispiel plunkr:

Plunker

Wenn Sie auf die Schaltfläche Hinzufügen klicken Sie, wird eine neue Komponente mit dem Testfeld zugeordnet „Test“

this.cmp.instance.test = "the test"; 

hinzufügen oder Sie können die Komponenten wie in @ Günters Antwort vordefinieren (https://stackoverflow.com/a/36325468/5706293) und dann entsprechend anhängen

+2

'DynamicComponentLoader' ist veraltet, stattdessen' ViewContainerRef.createComponent() 'verwenden. Siehe meinen Link oben. –

+2

Ich sehe, Sie haben den Code bereits aktualisiert. Du musst "DynamicComponentLoader" nicht einspielen, wenn du es nicht benutzt ;-) –

+0

@ GünterZöchbauer Ich aktualisiere es sofort, Sir, es war eine alte Vorlage: D – echonax