【发布时间】:2017-09-23 17:10:54
【问题描述】:
我正在尝试创建一个接受多个模板作为输入的组件。这是我的例子:
@Component({
selector: 'data-list',
styles: [
require('./data-list.component.scss')
],
template: `
<ng-template
*ngFor="let item of itemsData"
ngFor let-item [ngForOf]="[item]" [ngForTemplate]="itemTemplate"
></ng-template>
`
})
export class DataListComponent {
@Input() itemsData: any[];
@ContentChild(TemplateRef) itemTemplate: TemplateRef<ElementRef>;
}
如您所见,这是我正在尝试的一个相当简单的组件。该组件仅接受要显示的项目的数据以及项目的模板。这个组件可以这样使用:
<data-list [itemsData]="data">
<ng-template let-item>
<h1>{{ item.header }}</h1>
<div>{{ item.content }}</div>
</ng-template>
</data-list>
如上所示,我使用ng-content 传递模板,然后由DataListComponent 和@ContentChild(TemplateRef) itemTemplate: TemplateRef<ElementRef>; 读取。
我的问题是是否可以将多个模板传递给一个组件。
作为示例,我们会传递项目的模板,但如果它是第一个项目,则需要不同的模板。这意味着将在DataListComponent 中对第一项进行检查,然后使用由使用它的组件指定的模板。
简单示例:
我可以这样做来解决这个问题:
@Component({
selector: 'data-list',
styles: [
require('./data-list.component.scss')
],
template: `
<span *ngFor="let item of itemsData; let i = index" >
<ng-template *ngIf="i > 0; else nextTmpl"
ngFor let-item [ngForOf]="[item]" [ngForTemplate]="itemTemplate"
></ng-template>
</span>
<ng-template #nextTmpl>
Next
</ng-template>
`
})
然而,“下一个模板”不是由使用DataListComponent 的组件指定的,因此将始终是相同的模板。
【问题讨论】:
-
您的意思是
ngIf? -
是的,我已经更新了问题,试图更好地解释我的意思。
-
如果您希望在“外部”上命名您的模板,这是一个更好的方法stackoverflow.com/a/66172026/16940
标签: angular angular-components angular-template