2016-08-05 13 views
5

में ngFor के अंदर एक फ़ंक्शन को कॉल करें हैलो मैं Angular2 का उपयोग कर रहा हूं और सर्वर लाने और प्रत्येक आईडी के लिए कुछ मान प्राप्त करने के लिए चाहता हूं जो मुझे ngFor में मिलता है।angular2

<div *ngFor="let item in items"> 
    <span> here call a function that do something with 'item' and return something new <span> 
</div> 
+0

एक अजीब आवश्यकता की तरह लगता है। आप क्या खत्म करने की कोशिश कर रहे हैं? –

+0

@ गुंटर ज़ोचबॉयर उदाहरण के लिए, कुछ जटिल तरीके से आइटम गुणों का डिस्प्ले नाम उत्पन्न करें। यह बिल्कुल अजीब नहीं है। – user2061057

+0

इसे कोड में करें और इसे प्रत्येक 'आइटम' को असाइन करें और फिर इसे' * ngFor' के अंदर उपयोग करें। टेम्पलेट बाइंडिंग से इस तरह के फ़ंक्शन कॉल को हतोत्साहित किया जाता है। –

उत्तर

2

बेहतर इस तरह के समारोह कर * ngFor परिवर्तन के बाद एक सदस्यता में ngOnInit में प्रत्येक आइटम पर कहता है, और फिर वे साथ प्रदर्शित किया जाना चाहिए।

और परिवर्तन:

import { Directive, Output, EventEmitter, Input, SimpleChange} from '@angular/core'; 

@Directive({ 
    selector: '[onCreate]' 
}) 
export class OnCreate { 

    @Output() onCreate: EventEmitter<any> = new EventEmitter<any>(); 
    constructor() {} 
    ngOnInit() {  
    this.onCreate.emit('dummy'); 
    } 

} 

और उसके बाद आप इसका इस्तेमाल कर सकते हैं:

<div *ngFor="let item in items"> 

<div *ngFor="let item of items"> 
+0

क्या आप ऊपर सुझाए गए तरीके के लिए कुछ कोड प्रदान करेंगे ?? – Keshav

5

आप प्रत्येक यात्रा के लिए विधि कॉल करने के लिए कस्टम निर्देश का उपयोग कर सकते करने के लिए आपके * ngFor में आपके घटक में विधि को कॉल करने के लिए:

<div *ngFor="let item of items"> 
    <div *ngIf="item" (onCreate)="yourMethod(item)"> 
    </div> 
</div> 

आपका घटक में आप के रूप में इस विधि कॉल कर सकते हैं:

yourMethod(item){ 
    console.log(item); 
} 
5

बहुत अच्छा है, तथापि, सबसे आसान तरीका नहीं लगती:

<div *ngFor="let item of items"> 
    <span data-dummy="{{myFunction()}}" > here call a function that do something with 'item' and return something new <span> 
</div> 

उचित तरीका:

@Directive({ 
    selector: '[runDummyFunc]' 
}) 
export class runDummyFunc { 

    constructor() {} 
    ngOnInit() {  
    this.runDummyFunc() 
    } 

} 


<div *ngFor="let item in items"> 
    <span [runDummyFunc]="myFunction" > here call a function that do something with 'item' and return something new <span> 
</div> 

आपकी कक्षा में:

 myFunction =():void=>{ 

     console.log('whatever'); 
     } 
+2

फ़ंक्शन को कॉल करने के लिए इंटरपोलेशन का उपयोग करना एक प्रामाणिक तरीका नहीं है, क्योंकि इसे 'ngOnChanges' के कारण कई बार बुलाया जाएगा। @ xe4me –

+1

@ बुशान गडेकर, मुझे पता है कि यह एक अच्छा तरीका नहीं है, इसलिए मैंने कहा है कि अच्छा नहीं लगता है, लेकिन यही वह चाहता है, और वह आसानी से फ़ायर_ऑन्स जैसे चर बना सकता है और इसे सही पर सेट कर सकता है एक बार कहा जाता है, किसी भी तरह से, यह एक अच्छा तरीका नहीं है – Milad

4

कैसे के बारे में बदलने के डेटा से पहले यह टाइपप्रति अपने आप में *ngFor की बात आती है,

this.items.forEach((item,index)=>{ 
    item=this.func(item,index); 
}) 

func(item,index):string{ 
    return item+ String(index); //do whatever you wish to do. 
} 
1

टेम्पलेट, आप घटक कोड में अपने डेटा प्राप्त करना चाहते करने के लिए जगह नहीं है। लगता है जैसे आप किसी अवलोकन के जैसे कुछ उपयोग करना चाहते हैं, जिससे आप स्रोत में प्रत्येक आइटम के लिए एक और अवलोकन कर सकते हैं। यह एक http एपीआई कॉल का रिटर्न या (fiddle):

var ids = ["a", "d", "c"]; 
var lookupValues = { "a": 123, "b": 234, "c": 345, "d": 456 }; 

// given an id 
function fakeApiCall(id) { 
    // given an id, return an observable with one entry: an object consisting 
    // of an 'id' property with that id value and a 'lookup' property with the 
    // value from lookupValues for that id 
    return Rx.Observable.just({ id: id, lookup: lookupValues[id] }); 
} 

var o1 = Rx.Observable.from(ids); // 'a, d, c 

var o2 = o1.flatMap(x => { 
    // here we get each value from o1, so we do an api call and return 
    // an observable from each that will have the values in that 
    // observable combined with all others to be sent to o2 
    return fakeApiCall(x); 
}); 

o2.subscribe(x => { 
    document.write(JSON.stringify(x) + "<br/>"); 
}); 

// result: 
// {"id":"a","lookup":123} 
// {"id":"d","lookup":456} 
// {"id":"c","lookup":345}