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

Boo Yan Jiong
źródło
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:

yurzui
źródło
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
18

To najlepsze rozwiązanie, jakie znalazłem: https://stackoverflow.com/a/40165639/3870815

W tej odpowiedzi używają:

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

Aby zbudować listę tych dynamicznie generowanych komponentów. Gorąco polecam to sprawdzić!

Alex Boisselle
źródło
1
Najlepsza odpowiedź!
igg
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>
user14002866
źródło
-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>
Babak irannezhad
źródło