我正在尝试创建一个组件,它将执行一些操作并循环结果集。我希望能够提供一个"模板"对于循环结果集中的项目。
例如,这是我想要的想法:
<search-field>
<ng-template let-item>
<span><strong>{{item.foo}}</strong></span>
<span>{{item.bar}}</span>
</ng-template>
</search-field>
search-field
组件中的内容应该用作该组件中循环结果集的每次迭代的模板。
这是search-field
组件的外观:
<div class="search-container">
<div class="search-input">
<input type="text" class="form-control" placeholder="Search users..." [(ngModel)]="searchString" (ngModelChange)="searchStringChanged($event)">
<div class="md-icon">search</div>
</div>
<ul class="search-results" *ngIf="searchResults.length > 0">
<li class="search-results__item" *ngFor="let result of searchResults">
<ng-content [item]="item"></ng-content> <!-- Template should be used here on each iteration and allow to pass in "item" to use in example up above -->
</li>
</ul>
</div>
如何将循环的每个项目传递给ng-content,以便我可以在第一个示例的代码中访问它?
答案 0 :(得分:10)
解决了以下问题:
组件模板用法:
<search-field>
<ng-template let-item>
<span><strong>{{item.username}}</strong></span>
<span>{{item.email}}</span>
</ng-template>
</search-field>
组件模板定义:
<div class="search-container">
<div class="search-input">
<input type="text" class="form-control" placeholder="Search users..." [(ngModel)]="searchString" (ngModelChange)="searchStringChanged($event)">
<div class="md-icon">search</div>
</div>
<ul class="search-results" *ngIf="searchResults.length > 0">
<li class="search-results__item" *ngFor="let item of searchResults">
<ng-template [ngTemplateOutlet]="templateRef" [ngTemplateOutletContext]="{$implicit: item}"></ng-template>
</li>
</ul>
</div>
组件类:
@Component({...})
export class SearchFieldComponent {
@ContentChild(TemplateRef) templateRef: TemplateRef<any>;
// ...
}
解释:
使用ng-template
,我可以使用let-item
语法,其中item
是在循环的每次迭代中传递到模板的数据。
为了实现上述目标,我在search-field
组件中使用ng-template
并将ngTemplateOutlet
作为模板参考,并为ngTemplateOutletContext
赋予值{{ 1}},其中{$implicit: item}
是我想传递给模板的数据。
最后,在组件类中,我需要使用item
来获取要在ContentChild
中使用的模板的引用。