Component with ngFor that accept template and pass it to the children, how to do it?
我正在开发一个 Angular 6 应用程序。
我有一个组件 BelloComponent 呈现在 @Input 项目上传递的列表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | @Component({ selector: 'bello', template: ` <ul *ngIf="items?.length"> <li *ngFor="let item of items"> ??? </li> </ul> ` }) export class BelloComponent { @Input() items: Array<Object>; } |
而消费者,AppComponent 使用 BelloComponent。
如何将列表从 AppComponent 中传递给 BelloComponent 标签内的模板?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | @Component({ selector: 'my-app', template: ` <bello [items]="cacche_list"> {{ name }}, puzza value: {{ puzza }} </bello>` }) export class AppComponent { cacche_list = [ { name: 'cacca 1', puzza: 3 }, { name: 'cacca 2', puzza: 5 }, { name: 'cacca 3', puzza: 66 }, { name: 'cacca 4', puzza: 5 }, { name: 'cacca 5', puzza: 2 }, { name: 'cacca 6', puzza: 12 }, ]; } |
stackblitz 是这样的:https://stackblitz.com/edit/angular-exbhsv?file=src/app/app.component.ts
我想我错过了一些东西,如何告诉 BelloComponent 如何在 ngFor 中渲染元素?如何访问从 AppComponent 呈现的单个项目?
使用嵌入你可以这样处理它
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | @Component({ selector: 'bello', template: ` <ul *ngIf="items?.length"> <li *ngFor="let item of items"> <ng-container *ngTemplateOutlet="liTemplate; context: { $implicit: item}"></ng-container> </li> </ul> ` }) export class BelloComponent { @ContentChild(TemplateRef) liTemplate: TemplateRef; @Input() items: Array<Object>; } |
在你的容器组件中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | @Component({ selector: 'my-app', template: ` <bello [items]="cacche_list"> <ng-template let-item> {{ item.name }}, puzza value: {{ item.puzza }} </ng-template> </bello>` }) export class AppComponent { cacche_list = [ { name: 'cacca 1', puzza: 3 }, { name: 'cacca 2', puzza: 5 }, { name: 'cacca 3', puzza: 66 }, { name: 'cacca 4', puzza: 5 }, { name: 'cacca 5', puzza: 2 }, { name: 'cacca 6', puzza: 12 }, ]; } |
有关更多信息,请参阅此博客 https://www.kaels-kabbage.com/post/angular-transclusion-with-parameters/
你可以简单地在bello组件中使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | @Component({ selector:"bello", template: ` <ul *ngIf="items?.length"> <li *ngFor="let item of items"> <ng-content></ng-content> </li> </ul> ` }) export class BelloComponent { @Input() items: Array<Object>; } |
唯一缺少的是
中的
1 2 3 4 5 6 7 8 | <ul *ngIf="items?.length"> <li *ngFor="let item of items"> {{item.name}} </li> </ul> |
演示