2016-03-05 12 views
6

पास समारोह इस वर्ग मेरी expressjs आवेदन के अंदर सभी नियंत्रकों का विस्तार करने के लिए किया जाता है:ES6 क्लास, के रूप में पैरामीटर

import response from '../utils/responseParser.js'; 

const APISLUG = '/api/v1/'; 

export default class BaseController { 

    constructor(name, app, model){ 
    this.model = model; 
    this.app = app; 
    this.name = name; 
    console.log(model); 
    this.register(); 
    } 

    register() { 
    this.app.get(APISLUG + this.name, this.all); 
    } 
    /* 
    Retrive all records 
    */ 
    all(req, res, next) { 
    this.model.all(req.body, (err, data) => { 
     if(err) return res.json(response.replyError(data)); 
     return res.json(response.reply(data)); 
    }); 
    } 
} 

आप देख सकते हैं मैं बना दिया है एक "रजिस्टर" विधि स्वचालित रूप से सेट-अप करने के लिए सभी बुनियादी मार्ग

मैं इस लाइन पर एक त्रुटि unable to read property " model " of undefined " मिलती है:

this.app.get(APISLUG + this.name, this.all); 

मेरा मानना ​​है कि इस तथ्य यह है कि गुंजाइश खो जाना जब मैं पैरामीटर के रूप में समारोह पारित करने के लिए कारण है। इसे कैसे हल किया जा सकता है?

उत्तर

11

उपयोग bind विधि गुंजाइश बाध्य करने के लिए, इस

this.app.get(APISLUG + this.name, this.all.bind(this)); 
+0

धन्यवाद! यह काम करता हैं। –

+0

आपका स्वागत है :) –

+0

'। बाइंड (यह) 'जादू है, धन्यवाद! – Robula

3

की तरह आप वर्ग पर एक संपत्ति के रूप में एक तीर समारोह सेट कर सकते हैं। तीर कार्य this मान (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions) को लंबवत रूप से बांधता है।

अपने उदाहरण में:

export default class BaseController { 
    ... 
    all = (req, res, next) => { // This is the only line that changed 
    ... 
    } 
} 

नोट वर्गों पर तीर कि कार्यों मानक ES6 वाक्य रचना नहीं हैं, लेकिन शायद ES7 के साथ आ जाएगा (इस बारे में कुछ नोट यहाँ टिप्पणी में: https://stackoverflow.com/a/31362350/2054731)। आपको और/या अन्य ES7 सुविधाओं का उपयोग करने में सक्षम होने के लिए आपको अपनी प्रोजेक्ट को कॉन्फ़िगर करने की आवश्यकता हो सकती है।

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