ตัวแปรอ้างอิงเทมเพลตแบบไดนามิกภายใน ngFor (Angular 9)


97

จะประกาศตัวแปรอ้างอิงเทมเพลตไดนามิก ภายในองค์ประกอบได้อย่างไรngFor

ฉันต้องการใช้คอมโพเนนต์ป็อปโอเวอร์จาก ng-bootstrap รหัสป๊อปโอเวอร์ (ที่มีการผูก 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ünterZöchbauer

เนื่องจากบทช่วยสอนของพวกเขากล่าวว่าเพื่อให้มีการผูก html ภายใน popover เราจึงต้องสร้างng-templateและอ้างอิงด้วยตัวแปรอ้างอิงเทมเพลตแต่ตอนนี้ฉันต้องการใช้ป๊อปโอเวอร์นี้ภายในngForองค์ประกอบ
Boo Yan Jiong

8
เพียงแค่ทำเช่นเดียวกัน ตัวแปรเทมเพลตจะแตกต่างกันสำหรับแต่ละองค์ประกอบแม้ว่าจะมีชื่อเดียวกันก็ตาม
GünterZöchbauer

3
จะเกิดอะไรขึ้นถ้าคุณใช้การอ้างอิงเดียวกันสำหรับทุกสิ่ง? คุณได้ทดสอบหรือไม่?
developer033

ฮ่า ๆ ฉันไม่เคยคิดแบบนั้นเลย ... ฉันจะทดสอบตอนนี้ ... เพราะฉันคิดอยู่ตลอดเวลาว่าจะประกาศตัวแปรอ้างอิงเทมเพลต ** ด้วย "ดัชนี" ** ... จะอัปเดตในภายหลังหลังจากที่ฉันทดสอบแล้ว .. : D
Boo Yan Jiong

คำตอบ:


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

ตัวอย่าง Plunker

สำหรับรายละเอียดเพิ่มเติมโปรดดู:


1
โปรดทราบว่าหากคุณใช้ an @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>

และมีสิ่งต่อไปนี้ในคอมโพเนนต์ปุ่มป็อปโอเวอร์

<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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.