ngFor内部的动态模板参考变量(Angular 9)


97

如何在元素内声明动态 模板引用变量ngFor

我想使用ng-bootstrap中的popover组件,弹出代码(带有HTML绑定)如下所示:

<ng-template #popContent>Hello, <b>{{name}}</b>!</ng-template>
<button type="button" class="btn btn-secondary" [ngbPopover]="popContent" popoverTitle="Fancy content">
    I've got markup and bindings in my popover!
</button>

如何这些元素包装在里面ngFor

<div *ngFor="let member of members">
    <!-- how to declare the '????' -->
    <ng-template #????>Hello, <b>{{member.name}}</b>!</ng-template>
        <button type="button" class="btn btn-secondary" [ngbPopover]="????" popoverTitle="Fancy content">
        I've got markup and bindings in my popover!
    </button>
</div>

嗯...有什么主意吗?


没有动态参考变量。您为什么认为它需要动态?
君特Zöchbauer

因为他们的教程说要在弹出窗口中具有html绑定,那么我们需要创建一个ng-template,并使用模板引用变量对其进行引用,但是现在我想在一个ngFor元素内使用此弹出窗口
Boo Yan Jiong

8
做同样的事情。即使每个模板变量具有相同的名称,其模板变量也将有所不同。
君特Zöchbauer

3
如果您对所有内容使用相同的ref会发生什么?你测试过了吗?
developer033

哈,我从没想过...我现在将对其进行测试...因为我一直在考虑如何使用“ index”声明一个模板引用变量** ...在测试之后将更新。 ..:D
Boo Yan Jiong

Answers:


99

模板引用变量的作用域仅限于定义它们的模板。结构化指令创建嵌套的模板,因此引入了单独的作用域。

因此,您可以只使用一个变量作为模板参考

<div *ngFor="let member of members">
  <ng-template #popupContent>Hello, <b>{{member.name}}</b>!</ng-template>
  <button type="button" class="btn btn-secondary" [ngbPopover]="popupContent" popoverTitle="Fancy content">
      I've got markup and bindings in my popover!
  </button>
</div>

它应该工作,因为它已经在内部声明了 <ng-template ngFor

柱塞示例

有关更多详细信息,请参见:


1
请注意,如果您使用@ViewChild,则不能使用此解决方案(然后应使用@AlexBoisselle的解决方案)
随机


1

允许这种情况的另一种方法是创建一个包装按钮和ng-template的组件

<div *ngFor="let member of members">
    <popover-button [member]="member"></pop-over-button>
</div>

并且在弹出按钮组件中具有以下内容

<ng-template #popContent>Hello, <b>{{member.name}}</b>!</ng-template>
    <button type="button" class="btn btn-secondary" [ngbPopover]="popContent" popoverTitle="Fancy content">
    I've got markup and bindings in my popover!
</button>

-1

你可以用trackBy: trackByFn*ngFor

<div *ngFor="let member of members;trackBy: trackByF">
    <ng-template #popupContent>Hello, <b>{{member.name}}</b>!</ng-template>
        <button type="button" class="btn btn-secondary" [ngbPopover]="popupContent" popoverTitle="Fancy content">
        I've got markup and bindings in my popover!
    </button>
</div>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.