【问题标题】:Angular 2 use a "template" for ng-content to use inside component loopAngular 2 使用“模板”让 ng-content 在组件循环中使用
【发布时间】:2018-03-30 07:49:07
【问题描述】:

我正在尝试创建一个组件,它会做一些事情并遍历结果集。我希望能够为循环结果集中的项目提供“模板”。

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

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

【问题讨论】:

    标签: html angular


    【解决方案1】:

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

    组件模板用法:

    <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-templatengTemplateOutlet 作为模板引用,并且ngTemplateOutletContext 被赋予值{$implicit: item},其中item 是我想传递给模板的数据。

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

    【讨论】:

    • 谢谢!这种方法也解决了嵌套的自定义组件
    猜你喜欢
    • 2017-04-12
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 2018-04-09
    相关资源
    最近更新 更多