2017-12-21 25 views
1

Für meine Anwendung habe ich eine Dropdown-Liste von "Anweisungen", die ein Benutzer auswählen kann. Wenn der Benutzer eine bestimmte Anweisung auswählt, wird ein API-Aufruf ausgeführt, der Methoden zur Anzeige dieser Daten, sogenannte ViewOptions, abruft. Das Format sieht wie folgt aus:Dynamisch erstellen Sie eine Komponente in Angular2 abhängig von Daten von einem API-Aufruf

[ 
    { 
    "Id": 1, 
    "OptionName": "Graph and table" 
    }, 
    { 
    "Id": 3, 
    "OptionName": "Query results" 
    } 
] 

Jetzt habe ich eine andere Komponente, die gemacht werden, wenn die viewoptions geladen werden, die eine Registerkarte mit Informationen je nach Ansichtsoptionen angezeigt werden soll. In diesem Beispiel gibt es also eine Registerkarte, auf der ein Diagramm und eine Datentabelle angezeigt werden müssen, und eine weitere Registerkarte, auf der die Ergebnisse einer Abfrage angezeigt werden.

auf der Registerkarte Komponente habe ich die folgende HTML:

<ngb-tabset justify="justified" *ngIf="viewOptions.length"> 
    <ngb-tab *ngFor="let vo of viewOptions" id="{{vo.Id}}"> 
    <ng-template ngbTabTitle>{{vo.OptionName}}</ng-template> 
    <ng-template ngbTabContent></ng-template> 
    </ngb-tab> 
</ngb-tabset> 

Also, für jeden viewoption wird eine Registerkarte mit dem richtigen Titel wiedergegeben werden. Jetzt liegt meine Verwirrung darin, wie ich mit dem 'ngbTabContent' umgehen sollte. Hier möchte ich eine bestimmte Komponente abhängig von der Viewoption, zum Beispiel, wenn es ein "Graph und Tabelle" ist, habe ich die Komponente, für "Abfrageergebnisse" habe ich die Komponente, und so weiter ... Ich bin ziemlich neu in Angular2 und Ich habe das Gefühl, dass ich dies mit einer Art Templating machen muss, aber die Tatsache, dass ich dies dynamisch machen muss, hängt von diesem 'vo'-Parameter in einem ng ab, der etwas mit meinem Kopf vermischt.

+0

Ich schlage vor, Sie beginnen mit dem Artikel [Hier ist, was Sie über dynamische Komponenten in Angular wissen müssen] (https://blog.angularindepth.com/here-is-what-you-need-to-know-about-dynamic -components-in-angular-ac1e96167f9e) –

+0

Vielen Dank, der Link, den Sie zur Verfügung gestellt haben, hat mich in die richtige Richtung geschoben. –

Antwort

1

Sie können das Problem lösen, indem Sie eine untergeordnete Route hinzufügen. Sie müssen router-outlet statt ngTabContent platzieren, Ihre dynamischen Komponenten als untergeordnete Route verknüpfen und zu einer richtigen Route umleiten.

Ihre Stammkomponente HTML

<ngb-tabset justify="justified" *ngIf="viewOptions.length"> 
    <ngb-tab *ngFor="let vo of viewOptions" id="{{vo.Id}}"> 
    <ng-template ngbTabTitle>{{vo.OptionName}}</ng-template> 
    </ngb-tab> 
    <router-outlet></router-outlet> 
</ngb-tabset> 

Ihre Eltern Komponentencode

onBackendResponse(res) { 
    if (res.dynamicComponent === 'first') { 
     this.router.navigateByUrl('firstDynamic'); 
    } else if (res.dynamicComponent === 'second') { 
     this.router.navigateByUrl('secondDynamic'); 
    } 
} 

Ihre Routing

const appRoutes: Routes = [ 
    { 
    path: 'parent', component: ParentComponent, children: [ 
     { path: 'firstDynamic', component: FirstDynamic }, 
     { path: 'secondDynamic', component: SecondDynamic } 
    ] 
    }, 
]; 
+0

Ich sehe irgendwie, was du da machst und probierst es aus, aber ich habe bereits irgendwo einen Router benutzt und hatte Angst, dass dies auch meine andere Router-Steckdose würde mit dieser Navigation übereinstimmen. Mein Verdacht war richtig, jetzt ersetzt er nur meine ganze Seite (wo der Router-Ausgang ist) mit dieser Route, anstatt nur den Inhalt der richtigen Registerkarte ... Kann ich das umgehen oder wird eine andere Lösung in diesem Fall geeigneter sein ? –

+0

Vergiss es, ich habe den Teil vermisst, wo du die Route mit der Elternkomponente verknüpfen musstest, derp ... ich habe es repariert und es funktioniert so, sehr verpflichtet. :) –

+0

Macht mir nichts aus ... Zum einen fand ich diese Lösung schon ein wenig eklig. Ich wollte keinen anderen Router-Ausgang haben und meine Routen durcheinander bringen, nur um einige Tabs anzuzeigen, und zweitens, während es zu funktionieren schien Wann immer ich Tabs änderte, funktionierte es anfangs, aber als ich zurückwählte, wurde der Inhalt dieses Tabs nicht angezeigt. Ich habe eine andere Lösung gefunden (die meiner Meinung nach auch viel sauberer ist), die den Inhalt der Tabs tatsächlich "vorleitet". –

Verwandte Themen