2016-02-07 9 views
16

में चर बनाने के लिए कैसे मैं एक ngFor पाश में एक चर बनाने के लिए पता लगाने की कोशिश कर रहा हूँ।ng2: ngFor loop

<td *ngFor="#prod of products"> 
    <a href="{{getBuild(branch,prod)?.url}}"> 
    {{getBuild(branch,prod)?.status}} 
    </a> 
</td> 

आप देख सकते हैं "getBuild" कॉल कई बार दोहराया जाना है:

मैं इस तरह एक पाश की है। (मेरे वास्तविक उदाहरण में कई बार)। मैं लूप के अंदर एक बार टेम्पलेट में इस चर को बनाने का तरीका चाहूंगा और बस इसका पुन: उपयोग करूंगा। क्या इसे करने का कोई तरीका है?

+0

अनिवार्य रूप से एक ही प्रश्न: http://stackoverflow.com/questions/35162539/how-do-you-run- यहां एक नमूना है ए-फ़ंक्शन-ऑन-द-नतीजे-एनजीएफ-इन-एंजुलर 2 –

उत्तर

6

मुझे लगता है कि स्थानीय चर (# चरित्र के साथ परिभाषित) आपके उपयोग के मामले के लिए लागू नहीं है।

वास्तव में, जब आप किसी HTML तत्व पर स्थानीय चर परिभाषित करते हैं तो यह किसी भी घटक के अनुरूप होता है। जब तत्व पर कोई घटक नहीं होता है, तो चर तत्व को ही संदर्भित करता है।

स्थानीय चर के लिए एक मान निर्दिष्ट करना आपको वर्तमान तत्व से जुड़े एक विशिष्ट निर्देश का चयन करने की अनुमति देता है। उदाहरण के लिए:

<input #name="ngForm" ngControl="name" [(ngModel)]="company.name"/> 

name चर में वर्तमान के साथ जुड़े ngForm निर्देश का उदाहरण स्थापित करेगा।

तो स्थानीय चर आपके इच्छित लक्ष्य को लक्षित नहीं करते हैं, यानी एक लूप के वर्तमान तत्व के लिए बनाए गए मान को सेट करना।

आप ऐसा कुछ करने की कोशिश करते हैं:

<div *ngFor="#elt of eltList" > 
    <span #localVariable="elt.title"></span> 
    {{localVariable}} 
</div> 

आप इस निम्न त्रुटि होगा:

Error: Template parse errors: 
There is no directive with "exportAs" set to "elt.title" (" 
    <div *ngFor="#elt of eltList" > 
    <span [ERROR ->]#localVariable="elt.title"></span> 
    {{localVariable}} 
    </div> 
"): [email protected]:10 

Angular2 वास्तव में प्रदान किए गए नाम elt.title यहाँ) मिलान एक निर्देश के लिए लग रहा है ... त्रुटि को पुन: उत्पन्न करने के लिए इस प्लंकर को देखें: https://plnkr.co/edit/qcMGr9FS7yQD8LbX18uY?p=preview

यह लिंक देखें: http://victorsavkin.com/post/119943127151/angular-2-template-syntax, अनुभाग "स्थानीय चर" f या अधिक जानकारी। index, last, even और odd:

यात्रा की वर्तमान तत्व के अलावा, ngFor केवल निर्यात मूल्यों कि स्थानीय चर में एलियास की जा सकती है, का एक सेट प्रदान करता है।https://angular.io/docs/ts/latest/api/common/NgFor-directive.html

आप क्या कर सकता है पाश में तत्व प्रदर्शित करने के लिए एक उप घटक बनाने के लिए है:

यह लिंक देखें। यह वर्तमान तत्व को पैरामीटर के रूप में स्वीकार करेगा और घटक के गुण के रूप में आपके "स्थानीय चर" को बनाएगा। आप घटक के टेम्पलेट में इस विशेषता का उपयोग करने में सक्षम होंगे ताकि यह लूप में प्रति तत्व एक बार बनाया जाएगा।

@Component({ 
    selector: 'elt', 
    template: ` 
    <div>{{attr}}</div> 
    ` 
}) 
export class ElementComponent { 
    @Input() element; 

    constructor() { 
    // Your old "localVariable" 
    this.attr = createAttribute(element.title); 
    } 

    createAttribute(_title:string) { 
    // Do some processing 
    return somethingFromTitle; 
    } 
} 

और जिस तरह से इसका इस्तेमाल करने की:

<div *ngFor="#elt of eltList" > 
    <elt [element]="elt></elt> 
</div> 
+1

मुझे लगता है कि आप सही हैं। मैं एक आसान तरीका की उम्मीद कर रहा था लेकिन यह अभी संभव नहीं दिख रहा है। IMHO यह बहुत अच्छा होगा अगर टेम्पलेट अभिव्यक्ति के परिणामों के लिए स्थानीय रूप से चर सेट करने के लिए वाक्यविन्यास था। यह इस प्रकार के उपयोग को थोड़ा आसान बना सकता है। – Allen

+0

हाँ, सहमत हो गया! मैंने Angular github में यह जानने के लिए एक मुद्दा पोस्ट किया कि क्या इसके बारे में कुछ योजना बनाई गई है: https://github.com/angular/angular/issues/6947। –

+3

ngFor पर थोड़ा बदलाव ध्यान रखना महत्वपूर्ण है: '* ngFor =" सूची के मेरे संस्करण को "। इसे देखें: (https://angular.io/docs/ts/latest/api/common/NgFor-directive.html) –

1

नहीं, बस प्रत्येक branch/prod संयोजन के लिए getBuild में परिणाम कैश या जब तक यह पहले की तरह ही मूल्यों के साथ कहा जाता है।

+0

समझा गया कि मैं परिणाम कैश कर सकता हूं। मुद्दा यह नहीं है कि गणना में काफी समय लगता है (यह पहले से ही कैश किया गया है)। यह सिर्फ इतना है कि मैं लूप के शरीर में कई बार कॉल दोहराना नहीं चाहता हूं। मैं अवधारणात्मक रूप से करने के लिए एक तरीका की उम्मीद कर रहा था: "बिल्ड = getbuild (शाखा, प्रोड)" और फिर बस लूप के अंदर निर्माण का उपयोग करें। – Allen

+0

मुझे यकीन है कि यह संभव नहीं है। यदि गणना महंगा नहीं है तो मैं वैसे भी परेशान नहीं होगा। –

8

मुझे लगता है कि यह सबकंपोनेंट बनाने के लिए एक क्लासिक मामला है।

<td *ngFor="#prod of products"> 
    <subComp [prod]=prod></subComp> 
</td> 

आपका घटक तो एक prod इनपुट है और OnInit में एक बार आवश्यक समारोह चलाना शामिल है।

सरल उदाहरण फेंकना here

+2

मैं एक उप घटक बना सकता हूं जो इनपुट के रूप में शाखा और प्रोड को लेता है। ऐसा कुछ ऐसा लगता है जो एचटीएमएल की कुछ पंक्तियों के लिए भारी वजन लगता है जो "पैरेंट" घटक टेम्पलेट में किया जा सकता है। मैं ngFor के अंदर एक चर निर्दिष्ट करने और लूप के शरीर में इसका उपयोग करने के लिए कुछ तरीके की उम्मीद कर रहा था। – Allen

संबंधित मुद्दे