循环 ng-template 在使用 *ngIf 和 ng-content 时显示错误的模板

丹尼尔·格里马

我有一个简单的数据列表组件,它可以作为输入传递要显示的数据,为列表设置标题以及为列表项设置自定义模板。

所有这些工作正常,但是当我*ngIf出于某种原因使用内部标题时,列表项的模板与我传递的模板不同。我认为这可能是一个问题,@ContentChild但我不确定问题是什么。

数据列表组件

@Component({
    selector: 'data-list',
    template: `
        <ng-content select="[data-list-header]"></ng-content>
        <div>
            <ng-template *ngFor="let item of itemsData" let-item [ngForOf]="[item]" [ngForTemplate]="itemTemplate">
            </ng-template>
        </div>
    `
})

export class DataListComponent {
    @Input() itemsData: any[];
    @ContentChild(TemplateRef) itemTemplate: TemplateRef<ElementRef>;
}

模板

<data-list [itemsData]="items">
    <div data-list-header style="border-bottom: 2px solid grey;">
        <h1>Persons List</h1>
        <h2>Count: {{ items.length }}</h2>
    </div>
    <ng-template let-item>
        <div>
            <h4>{{ item.name }} {{ item.surname }}</h4>
        </div>
    </ng-template>
</data-list>

结果是

在此处输入图片说明

上述模板工作正常,显示人员列表。但是,一旦我添加一个*ngIf隐藏计数作为示例,就会显示计数列表。

模板无法正常工作

<data-list [itemsData]="items">
    <div data-list-header style="border-bottom: 2px solid grey;">
        <h1>Persons List</h1>
        <h2 *ngIf="showCount">Count: {{ items.length }}</h2>
    </div>
    <ng-template let-item>
        <div>
            <h4>{{ item.name }} {{ item.surname }}</h4>
        </div>
    </ng-template>
</data-list>

结果是

在此处输入图片说明

这是上面的堆栈闪电战:https ://stackblitz.com/edit/ng-template-loop-issue

丹尼尔·格里马

出现这个问题是因为在使用结构指令(例如*ngIf)时ng-template总是会创建。

现在拥有@ContentChild(TemplateRef)意味着查找第一个模板 ( ng-template)的查询已完成。因此,在这种情况下,*ngIf在标题上有一个ng-template是自动创建的,然后由查询选取。

为了解决这个问题,使用了模板引用,以便@ContentChild()完成查询模板引用的搜索。例子:@ContentChild('itemTemplate')

更新代码:https : //stackblitz.com/edit/ng-template-loop-issue

更多信息:

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章