对于我的应用程序,我有一个用户可以选择的“语句”下拉列表。当用户选择特定语句时,将进行API调用,以检索如何显示此数据的方式,称为ViewOptions。格式如下:
[
{
"Id": 1,
"OptionName": "Graph and table"
},
{
"Id": 3,
"OptionName": "Query results"
}
]
现在我有一个不同的组件,在加载视图时会呈现,应该根据视图选项显示包含信息的选项卡。因此,在此示例中,有一个选项卡,其中必须显示图表和数据表,另一个选项卡必须显示查询结果。
在标签组件中,我有以下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>
因此,对于每个视图选项,将使用正确的标题呈现选项卡。现在我的困惑在于如何处理'ngbTabContent'的事情。在这里,我想要一个特定的组件,取决于viewoption,例如,如果它是一个“图表和表”,我有组件,“查询结果”我有组件,依此类推......我是Angular2的新手,我有一种感觉,我将不得不用某种模板来做这件事,但事实上,我必须根据* ng中的'vo'参数动态地做这件事。我的头脑中有点混乱。
答案 0 :(得分:1)
您可以通过添加子路由来解决它。您需要放置router-outlet
而不是ngTabContent
,将动态组件链接为子路由并重定向到正确的路径。
您的父组件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>
您的父组件代码
onBackendResponse(res) {
if (res.dynamicComponent === 'first') {
this.router.navigateByUrl('firstDynamic');
} else if (res.dynamicComponent === 'second') {
this.router.navigateByUrl('secondDynamic');
}
}
您的路由
const appRoutes: Routes = [
{
path: 'parent', component: ParentComponent, children: [
{ path: 'firstDynamic', component: FirstDynamic },
{ path: 'secondDynamic', component: SecondDynamic }
]
},
];
答案 1 :(得分:0)
在尝试了SirWojtek的解决方案后并没有真正找到适合我需求的解决方案(请参阅我对他的回答的评论),我找到了以下链接和解决方案#34; Dynamic Components&#34;正是我所寻找的:https://medium.com/@DenysVuika/dynamic-content-in-angular-2-3c85023d9c36