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.