Динамічна посилальна змінна шаблону всередині ngFor (Angular 9)


97

Як оголосити динамічну посилальну змінну шаблону всередині ngForелемента?

Я хочу використовувати компонент popover з 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>

Мда ... будь-яка ідея?


Не існує такого поняття, як динамічні посилальні змінні. Чому, на вашу думку, він повинен бути динамічним?
Günter Zöchbauer

тому що в їх навчальному посібнику сказано, що для того, щоб мати прив'язку html всередині поповера, нам потрібно створити a ng-templateта передати його за допомогою посилальної змінної шаблону , але тепер я хочу використовувати це поповер всередині ngForелемента
Boo Yan Jiong

8
Просто зробіть те саме. Змінна шаблону буде різною для кожного елемента, навіть якщо вона має однакову назву.
Günter Zöchbauer

3
Що станеться, якщо ви використовуєте однакові посилання для всього? Ви перевіряли?
developer033

Ха, я ніколи не думаю про це ... Я тестую це зараз ... тому що я продовжую думати про те, як оголосити посилальну змінну шаблону ** з "індексом" ** ... буде оновлено пізніше після тестування. ..: D
Boo Yan Jiong

Відповіді:


101

Змінні посилання на шаблон масштабуються до шаблону, в якому вони визначені. Структурна директива створює вкладений шаблон і, отже, вводить окрему область дії.

Тож ви можете просто використовувати одну змінну для посилання на шаблон

<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)
Випадкове

17

Це найкраще рішення, яке я знайшов: https://stackoverflow.com/a/40165639/3870815

У цій відповіді вони використовують:

@ViewChildren('popContent') components:QueryList<CustomComponent>;

Скласти список цих динамічно генерованих компонентів. Настійно рекомендую вам перевірити це!


1
Найкраща відповідь!
igg

1

Інший спосіб дозволити це створити компонент, який обгортає кнопку та ng-шаблон

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

І мати наступне в компоненті popover-button

<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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.