2016-03-05 13 views
6

Questa classe viene utilizzata per estendere tutti i controller all'interno della mia applicazione expressjs:ES6 classe, la funzione passa come parametro di

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)); 
    }); 
    } 
} 

Come potete vedere ho fatto un metodo di "registrare" per set-up automaticamente tutti i percorsi di base.

ottengo un errore di unable to read property " model " of undefined " su questa linea:

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

Credo che questo sia dovuto al fatto che la portata perdersi quando passo la funzione come parametro. Come posso risolvere questo?

risposta

11

Usa bind metodo per legare il campo di applicazione, come questo

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

Grazie! Funziona. –

+0

Prego :) –

+0

'.bind (this)' è magico, grazie! – Robula

3

È possibile impostare una funzione di freccia come una proprietà sulla classe. Le funzioni freccia vincolano lessicamente il valore this (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions).

Nel tuo esempio:

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

Si noti che le funzioni freccia sulle classi non sono la sintassi standard ES6, ma probabilmente verrà con ES7 (alcune note su che nei commenti qui: https://stackoverflow.com/a/31362350/2054731). Potrebbe essere necessario configurare il progetto per poter utilizzare questa e/o altre funzionalità di ES7.

Problemi correlati