NgFor के अंदर डायनामिक टेम्प्लेट संदर्भ चर (कोणीय 9)


100

कैसे एक तत्व के अंदर एक गतिशील टेम्पलेट संदर्भ चर घोषित करने के लिए ngFor?

मैं एनजी-बूटस्ट्रैप से पॉपओवर घटक का उपयोग करना चाहता हूं, पॉपओवर कोड (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>

हम्मम ... कोई आइडिया?


डायनामिक रेफरेंस वैरिएबल जैसी कोई चीज नहीं है। आपको क्यों लगता है कि इसे गतिशील होने की आवश्यकता है?
गुंटर ज़ोचबॉयर

क्योंकि उनके ट्यूटोरियल ने कहा था कि एक पॉपओवर के अंदर html बाइंडिंग है, तो हमें एक बनाने ng-templateऔर टेम्पलेट संदर्भ चर के साथ इसे संदर्भित करने की आवश्यकता है , लेकिन अब मैं एक ngForतत्व के अंदर इस पॉपओवर का उपयोग करना चाहता हूं
बू यान जिंग जी

8
बस वही करो। टेम्पलेट चर प्रत्येक तत्व के लिए अलग-अलग होगा, भले ही उसका नाम समान हो।
गुंटर ज़ोचबॉयर

3
यदि आप सब कुछ के लिए एक ही रेफरी का उपयोग करते हैं तो क्या होता है ? क्या आपने इसका परीक्षण किया है?
डेवलपर

हा, मैं ऐसा कभी नहीं सोचता ... मैं अब इसका परीक्षण करूंगा ... क्योंकि मैं यह सोचता रहता हूं कि "इंडेक्स" ** के साथ ** टेम्प्लेट रेफरेंस वेरिएबल कैसे घोषित किया जाए ... मैं इसे टेस्ट करने के बाद बाद में अपडेट करूंगा। ..: डी
बू यान यान जिंग

जवाबों:


105

टेम्प्लेट संदर्भ वेरिएबल्स को उनके द्वारा परिभाषित किए गए टेम्प्लेट में स्कोप किया जाता है। एक संरचनात्मक निर्देश एक नेस्टेड टेम्पलेट बनाता है और इसलिए, एक अलग गुंजाइश पेश करता है।

तो आप अपने टेम्प्लेट संदर्भ के लिए बस एक चर का उपयोग कर सकते हैं

<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, तो आप इस समाधान का उपयोग नहीं कर सकते (और उसके बाद @ एलेक्सबॉइसेल का उपयोग करना चाहिए)
रैंडम

18

यह मैंने पाया सबसे अच्छा समाधान है: https://stackoverflow.com/a/40165639/3870815

उस उत्तर में वे उपयोग करते हैं:

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

गतिशील रूप से उत्पन्न घटकों की सूची बनाने के लिए। अत्यधिक आपको इसकी जाँच करने की सलाह देते हैं!


1
सबसे अच्छा जवाब!
आईजीजी

1

इसे अनुमति देने के लिए एक और तरीका है कि एक घटक बनाया जाए जो बटन और एनजी-टेम्पलेट को लपेटता है

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

-2

आप उपयोग कर सकते हैं 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.