Dynamiczna zmienna odniesienia do szablonu wewnątrz ngFor (Angular 9)


101

Jak zadeklarować zmienną odniesienia do szablonu dynamicznego wewnątrz elementu?ngFor

Chcę użyć komponentu popover z ng-bootstrap, kod popover (z wiązaniem HTML) jest następujący:

<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>

Jak mogę zawinąć te elementy do środka 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>

Hmmm ... jakiś pomysł?


Nie ma czegoś takiego jak dynamiczne zmienne odniesienia. Jak myślisz, dlaczego musi być dynamiczny?
Günter Zöchbauer

ponieważ ich samouczek powiedział, że aby mieć wiązanie html wewnątrz popovera, musimy utworzyć ng-templatei odnieść go do zmiennej referencyjnej szablonu , ale teraz chcę użyć tego popovera wewnątrz ngForelementu
Boo Yan Jiong

8
Po prostu zrób to samo. Zmienna szablonu będzie inna dla każdego elementu, nawet jeśli ma taką samą nazwę.
Günter Zöchbauer

3
Co się stanie, jeśli używasz tego samego sędziego za wszystko? Czy to przetestowałeś?
programista033

Ha, nigdy o tym nie myślę ... Przetestuję to teraz ... ponieważ ciągle myślę o tym, jak zadeklarować zmienną referencyjną szablonu ** z "indeksem" ** ... zaktualizuje się później, po przetestowaniu. ..: D
Boo Yan Jiong,

Odpowiedzi:


105

Zakres zmiennych odwołań do szablonów obejmuje szablon, w którym zostały zdefiniowane. Dyrektywa strukturalna tworzy zagnieżdżony szablon, a zatem wprowadza oddzielny zakres.

Możesz więc użyć jednej zmiennej jako odniesienia do szablonu

<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>

i powinno działać, ponieważ już zadeklarował w środku <ng-template ngFor

Przykład Plunkera

Aby uzyskać więcej informacji, zobacz także:


1
Zwróć uwagę, że jeśli używasz @ViewChild, nie możesz użyć tego rozwiązania (a następnie powinieneś użyć rozwiązania @ AlexBoisselle)
losowo


1

Innym sposobem na to jest utworzenie komponentu, który otacza przycisk i szablon ng

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

I miej następujące elementy w komponencie przycisku popover

<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>

-2

Możesz użyć trackBy: trackByFnw*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>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.