2016-03-05 30 views
6

olarak geçiş fonksiyonu Bu sınıf benim expressjs uygulama içinde tüm denetleyicileri uzatmak için kullanılır: Eğer ben yapmış otomatik kurulum için bir "kayıt" yöntemi de görebileceğiniz gibiES6 Sınıf parametre

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

tüm temel yollar.

bu hat üzerinde bir hata unable to read property " model " of undefined " olsun:

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

Biliyorum bu parametre olarak işlev geçerken kapsamı kaybolmak olmasından kaynaklanmaktadır olduğuna inanıyoruz. Bunu Nasıl Çözebilirim?

cevap

11

Kullanım bind yöntem Sen sınıfı bir özellik olarak bir ok fonksiyonu ayarlayabilirsiniz bu

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

Teşekkür ederiz! işe yarıyor. –

+0

Rica ederim :) –

+0

'.bind (this)' sihirli, teşekkür ederim! – Robula

3

gibi, kapsamını bağlamak. Ok işlevleri, sözcüksel olarak this değerini (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions) bağlar. Örnekte

: (: https://stackoverflow.com/a/31362350/2054731 burada yorumlarda bu konuda bazı notlar) standart ES6 sözdizimi olmayan sınıflara işlevleri ok ama muhtemelen ES7 ile gelecek

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

Not. Bu ve/veya diğer ES7 özelliklerini kullanabilmek için projenizi yapılandırmanız gerekebilir.

İlgili konular