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

Lan*_*ara 5 html angular

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

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

<search-field>
    <ng-template let-item>
        <span><strong>{{item.foo}}</strong></span>
        <span>{{item.bar}}</span>
    </ng-template>
</search-field>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

如何将循环的每个项目传递给ng-content,以便我可以在第一个示例的代码中访问它?

Lan*_*ara 13

通过以下方式解决了这个问题:

组件模板用法:

<search-field>
    <ng-template let-item>
        <span><strong>{{item.username}}</strong></span>
        <span>{{item.email}}</span>
    </ng-template>
</search-field>
Run Code Online (Sandbox Code Playgroud)

组件模板定义:

<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>
Run Code Online (Sandbox Code Playgroud)

组件类:

@Component({...})
export class SearchFieldComponent {
    @ContentChild(TemplateRef) templateRef: TemplateRef<any>;

    // ...
}
Run Code Online (Sandbox Code Playgroud)

说明:

使用ng-template,我可以使用let-item语法,在item循环的每次迭代中将传递到模板的数据在哪里.

而为了使上述可能,在search-field我使用的组件ng-templatengTemplateOutlet作为模板的参考,并且ngTemplateOutletContext被赋予值{$implicit: item},这里item是我想传递到模板中的数据.

最后,在组件类中,我需要使用它ContentChild来获取对模板的引用ngTemplateOutlet.