Angular 将多个模板传递给组件
Angular pass multiple templates to Component
我正在尝试创建一个接受多个模板作为输入的组件。这是我的例子:
@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>
`
})
然而,"Next Template" 不是由使用 DataListComponent
的组件指定的,因此将始终是相同的模板。
试试这个。
@Component({
selector: 'data-list',
styles: [
require('./data-list.component.scss')
],
template: `
<ng-template ngFor [ngForOf]="itemsData" [ngForTemplate]="itemTemplate"></ng-template>
`
})
export class DataListComponent {
@Input() itemsData: any[];
@ContentChild(TemplateRef) itemTemplate: TemplateRef<ElementRef>;
}
我通过使用 ContentChild 装饰器可用的字符串选择器解决了同样的问题。
使用数据列表组件时需要指定模板变量:
<data-list [itemsData]="data">
<ng-template #firstItemTemplate let-item>
<h1 style="color:red;">{{ item.header }}</h1>
<div>{{ item.content }}</div>
</ng-template>
<ng-template #standardTemplate let-item>
<h1>{{ item.header }}</h1>
<div>{{ item.content }}</div>
</ng-template>
</data-list>
然后,在您的数据列表组件中 class,将模板变量分配给组件上的局部变量:
@Input() itemsData: any[];
@ContentChild('firstItemTemplate') firstItemTemplate: TemplateRef<ElementRef>;
@ContentChild('standardTemplate') standardTemplate: TemplateRef<ElementRef>;
在此之后,您将能够从数据列表组件呈现传入的模板。
@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]="firstItemTemplate"
></ng-template>
<ng-template #nextTmpl
ngFor let-item [ngForOf]="[item]" [ngForTemplate]="standardTemplate"
></ng-template>
</span>
`
})
我正在尝试创建一个接受多个模板作为输入的组件。这是我的例子:
@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>
`
})
然而,"Next Template" 不是由使用 DataListComponent
的组件指定的,因此将始终是相同的模板。
试试这个。
@Component({
selector: 'data-list',
styles: [
require('./data-list.component.scss')
],
template: `
<ng-template ngFor [ngForOf]="itemsData" [ngForTemplate]="itemTemplate"></ng-template>
`
})
export class DataListComponent {
@Input() itemsData: any[];
@ContentChild(TemplateRef) itemTemplate: TemplateRef<ElementRef>;
}
我通过使用 ContentChild 装饰器可用的字符串选择器解决了同样的问题。
使用数据列表组件时需要指定模板变量:
<data-list [itemsData]="data">
<ng-template #firstItemTemplate let-item>
<h1 style="color:red;">{{ item.header }}</h1>
<div>{{ item.content }}</div>
</ng-template>
<ng-template #standardTemplate let-item>
<h1>{{ item.header }}</h1>
<div>{{ item.content }}</div>
</ng-template>
</data-list>
然后,在您的数据列表组件中 class,将模板变量分配给组件上的局部变量:
@Input() itemsData: any[];
@ContentChild('firstItemTemplate') firstItemTemplate: TemplateRef<ElementRef>;
@ContentChild('standardTemplate') standardTemplate: TemplateRef<ElementRef>;
在此之后,您将能够从数据列表组件呈现传入的模板。
@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]="firstItemTemplate"
></ng-template>
<ng-template #nextTmpl
ngFor let-item [ngForOf]="[item]" [ngForTemplate]="standardTemplate"
></ng-template>
</span>
`
})