根据来自 API 调用的数据在 Angular2 中动态创建组件
Dynamically create a component in Angular2 depending on data from an API call
对于我的应用程序,我有一个 'Statements' 的下拉列表,用户可以 select。当用户 select 执行特定语句时,会进行 API 调用以检索必须如何显示此数据的方式,称为 ViewOptions。格式如下:
[
{
"Id": 1,
"OptionName": "Graph and table"
},
{
"Id": 3,
"OptionName": "Query results"
}
]
现在我有一个不同的组件,它将在加载视图选项时呈现,它应该根据视图选项显示一个包含信息的选项卡。因此,在此示例中,有一个选项卡必须显示图表和 table 数据,另一个选项卡必须显示查询结果。
在选项卡组件中,我有以下 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' 事情。在这里,我想要一个取决于视图选项的特定组件,例如,如果它是 "Graph and table",我有组件,对于 "Query results",我有组件,依此类推......我对 Angular2 很陌生我有一种感觉,我将不得不通过某种模板来做到这一点,但事实上我必须根据 *ngFor 中的 'vo' 参数动态地做到这一点,这让我有点困惑。
可以通过添加子路由来解决。您需要放置 router-outlet
而不是 ngTabContent
,link 您的动态组件作为子路由并重定向到正确的子路由。
你的父组件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 }
]
},
];
在尝试了 SirWojtek 的解决方案后发现它并不真正适合我的需要(请参阅我对他的回答的评论),我发现了以下 link 并且 "Dynamic Components" 段下提供的解决方案正是我在找什么:https://medium.com/@DenysVuika/dynamic-content-in-angular-2-3c85023d9c36
对于我的应用程序,我有一个 'Statements' 的下拉列表,用户可以 select。当用户 select 执行特定语句时,会进行 API 调用以检索必须如何显示此数据的方式,称为 ViewOptions。格式如下:
[
{
"Id": 1,
"OptionName": "Graph and table"
},
{
"Id": 3,
"OptionName": "Query results"
}
]
现在我有一个不同的组件,它将在加载视图选项时呈现,它应该根据视图选项显示一个包含信息的选项卡。因此,在此示例中,有一个选项卡必须显示图表和 table 数据,另一个选项卡必须显示查询结果。
在选项卡组件中,我有以下 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' 事情。在这里,我想要一个取决于视图选项的特定组件,例如,如果它是 "Graph and table",我有组件,对于 "Query results",我有组件,依此类推......我对 Angular2 很陌生我有一种感觉,我将不得不通过某种模板来做到这一点,但事实上我必须根据 *ngFor 中的 'vo' 参数动态地做到这一点,这让我有点困惑。
可以通过添加子路由来解决。您需要放置 router-outlet
而不是 ngTabContent
,link 您的动态组件作为子路由并重定向到正确的子路由。
你的父组件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 }
]
},
];
在尝试了 SirWojtek 的解决方案后发现它并不真正适合我的需要(请参阅我对他的回答的评论),我发现了以下 link 并且 "Dynamic Components" 段下提供的解决方案正是我在找什么:https://medium.com/@DenysVuika/dynamic-content-in-angular-2-3c85023d9c36