2016-04-27 11 views
6

मैं एक कोड है कि इस तरह दिखता है:Angular2 'इस' अपरिभाषित है

export class CRListComponent extends ListComponent<CR> implements OnInit { 

    constructor(
     private router: Router, 
     private crService: CRService) { 
     super(); 
    } 

    ngOnInit():any { 
     this.getCount(new Object(), this.crService.getCount); 
    } 

ListComponent कोड इस

@Component({}) 
export abstract class ListComponent<T extends Listable> { 

    protected getCount(event: any, countFunction: Function){ 
     let filters = this.parseFilters(event.filters); 
     countFunction(filters) 
      .subscribe(
       count => { 
        this.totalItems = count; 
       }, 
       error => console.log(error) 
      ); 
    } 

और CRService से उपयुक्त सेवा कोड टुकड़ा है यह:

getCount(filters) { 
    var queryParams = JSON.stringify(
     { 
      c : 'true', 
      q : filters 
     } 
    ); 

    return this.createQuery(queryParams) 
     .map(res => res.json()) 
     .catch(this.handleError); 
} 

अब जब मेरे ngOnInit() रन, मुझे एक त्रुटि मिलती है:

angular2.dev.js:23925 EXCEPTION: TypeError: Cannot read property 'createQuery' of undefined in [null]

ORIGINAL EXCEPTION: TypeError: Cannot read property 'createQuery' of undefined

तो मूल रूप से return this.createQuery(queryParams) कथन में शून्य होगा। क्या किसी के पास कोई विचार है कि यह कैसे संभव है?

+1

आपको क्यों लगता है कि यह .createQuery' मौजूद है? –

+2

क्या यह "सामान्य" है कि आपके 2 वर्गों में एक बंद ब्रैकेट गुम है? –

+0

मैंने अभी अनावश्यक भागों को छोड़ दिया है, कोड अन्यथा सिंटैक्टिक रूप से सही है। :) समस्या '.createQuery' के साथ नहीं है, यह 'यह' के साथ है। – Sleeper9

उत्तर

7

समस्या यहाँ स्थित है:

gOnInit():any { 
    this.getCount(new Object(), this.crService.getCount); // <---- 
} 

आप एक वस्तु के बाहर एक समारोह संदर्भ के बाद से। एक तीर समारोह में

this.getCount(new Object(), this.crService.getCount.bind(this.crService)); 

या लपेट:: आप इसे पर bind विधि इस्तेमाल कर सकते हैं

this.getCount(new Object(), (filters) => { 
    return this.crService.getCount(filters)); 
}); 

दूसरा दृष्टिकोण वरीय एक होगा, क्योंकि यह प्रकार रखने के लिए अनुमति देता है। अधिक जानकारी के लिए इस पेज देखें:

+0

धन्यवाद, ऐसा लगता है कि काम करता है! क्या HTML टेम्पलेट बाइंडिंग में ऐसा कोई तरीका है? मेरा मतलब है, मेरे पास निम्न कोड है: '(onLazyLoad) =" loadItems ($ event, this.crService.getCRs) "' क्या मैं इसे इस तरह से बदल सकता हूं? '(onLazyLoad) =" loadItems ($ event, (पेज, एन, सॉर्टफिल्ड, सॉर्टऑर्डर, फ़िल्टर) => {इस.crService.getCRs (पेज, एन, सॉर्टफिल्ड, सॉर्टऑर्डर, फ़िल्टर) को वापस करें}} " – Sleeper9

+0

ग्रेट! आपको टेम्पलेट्स में 'इस' कीवर्ड का उपयोग करने की आवश्यकता नहीं है। उस ने कहा, मैं एक मध्यवर्ती स्तर का उपयोग करेंगे। मेरा मतलब है: 'loadItems' विधि के भीतर this.crService.getCRs का उपयोग ... –

+1

अच्छा, मैं भी इस समाधान के साथ समाप्त हुआ। यह मेरे HTML टेम्पलेट्स में ऐसे बदसूरत कोड को एम्बेड करने से भी अधिक क्लीनर लगता है। सहायता के लिए धन्यवाद! :) – Sleeper9

2

इस त्रुटि मैं अपने समारोह त्रुटि उत्पन्न कर से बाहर सभी धर्मशाला yanked और एक अन्य समारोह में फेंक दिया ठीक करने के लिए तो त्रुटि दूर चला गया।

उदाहरण:

this.globalListenFunc = renderer.listenGlobal('document', 'click', (event) => { 
    this.evaluateClick(event); 
}); 

evaluateClick(evt: MouseEvent){ 
    // all the code I yanked out from above 
} 
:

मैं में यह

this.globalListenFunc = renderer.listenGlobal('document', 'click', (event) => { 
    // bunch of code to evaluate click event 
    // this is the code that had the "this" undefined error 
}); 

मैं कोड बाहर निकाला कुछ कोड के साथ इस समारोह था और एक बाहरी सार्वजनिक समारोह में रख, यहाँ समाप्त कोड है