我正在尝试为字符串数组的每个字段传递一个不同的模板。
TS
export class MyComponent {
fields = ['name', 'person.age', 'created_at', ...]
}
HTML
<div *ngFor="let field of fields">
<ng-container [ngTemplateOutlet]="field">
</ng-container>
</div>
<ng-template #name>
Name template
</ng-template>
<ng-template #created_at>
Created at template
</ng-template>
<ng-template #person.age>
person.age template
</ng-template>
我显然遇到错误,因为ngTemplateOutlet需要TemplateRef而不是字符串。但是如何动态传递一个字符串来引用正确的模板呢?
错误:templateRef.createEmbeddedView不是函数
PS:他们可能是解决这个问题的更好方法。不要犹豫分享:)谢谢!答案 0 :(得分:4)
您可以这样写:
<div *ngFor="let field of fields">
<ng-container *ngTemplateOutlet="{'name': name, 'created_at': created_at,
'person_age': person_age}[field]">
</ng-container>
</div>
<ng-template #name>
Name template
</ng-template>
<ng-template #created_at>
Created at template
</ng-template>
<ng-template #person_age>
person.age template
</ng-template>
这不需要子组件。
答案 1 :(得分:2)
请参阅注释以了解使用typescript传递引用的变通方法。 我只是想为那些有同样问题的人提一下第二个解决方案: 使用ngSwitch :)
<div *ngFor="let field of fields">
<div [ngSwitch]="field">
<div *ngSwitchCase="'name'">
{{ field }}
</div>
<div *ngSwitchCase="'person.age'">
{{ var[field] }} is my age
</div>
<div *ngSwitchDefault>
fallback
</div>
</div>
答案 2 :(得分:1)
您可以在父组件中创建模板,并将模板列表作为输入传递给子组件:
<my-child [templates]="{'name': name, 'created_at': created_at, 'person_age': person_age}"></my-child>
<ng-template #name>
Name template
</ng-template>
<ng-template #created_at>
Created at template
</ng-template>
<ng-template #person_age>
person.age template
</ng-template>
然后你可以简单地使用模板:
<ng-container *ngFor="let f of fields">
<ng-container *ngTemplateOutlet="templates[f]">
</ng-container>
</ng-container>
答案 3 :(得分:0)
export class YourClass {
@ViewChild('ciao') ciao: TemplateRef<any>;
@ViewChild('ciao2') ciao2: TemplateRef<any>;
fields: TemplateRef<any>[];
constructor () {
this.fields = [this.ciao, this.ciao2];
}
}
&#13;
<ng-template #ciao></ng-template>
<ng-template #ciao2></ng-template>
&#13;