Angular 2使用"模板"用于在组件循环内使用的ng-content

时间:2017-10-18 12:24:58

标签: html angular

我正在尝试创建一个组件,它将执行一些操作并循环结果集。我希望能够提供一个"模板"对于循环结果集中的项目。

例如,这是我想要的想法:

<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,以便我可以在第一个示例的代码中访问它?

1 个答案:

答案 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中使用的模板的引用。