2016-03-05 20 views
6

Lớp này được sử dụng để mở rộng tất cả các bộ điều khiển bên trong expressjs ứng dụng của tôi:ES6 Class, vượt qua chức năng như tham số

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

Như bạn có thể thấy tôi đã thực hiện một phương pháp "đăng ký" để tự động thiết lập tất cả các các tuyến cơ bản.

tôi nhận được một lỗi unable to read property " model " of undefined " trên dòng này:

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

Tôi tin rằng đây là do thực tế rằng phạm vi bị lạc khi tôi vượt qua các chức năng như tham số. Làm sao tôi có thể giải quyết việc này?

Trả lời

11

Sử dụng bind phương pháp để ràng buộc phạm vi, như thế này

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

Cảm ơn bạn! nó hoạt động. –

+0

Bạn được chào đón :) –

+0

'.bind (this)' là phép thuật, cảm ơn bạn! – Robula

3

Bạn có thể thiết lập một chức năng mũi tên như một tài sản trên lớp. Các hàm mũi tên liên kết một cách lexically giá trị this (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions).

Trong ví dụ của bạn:

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

Lưu ý rằng mũi tên chức năng trên lớp không phải là cú pháp ES6 tiêu chuẩn, nhưng có lẽ sẽ đi kèm với ES7 (một số lưu ý về điều đó trong ý kiến ​​ở đây: https://stackoverflow.com/a/31362350/2054731). Bạn có thể cần định cấu hình dự án của mình để có thể sử dụng tính năng này và/hoặc các tính năng ES7 khác.

Các vấn đề liên quan