javascript - This scope lost with inheritance -
here example code, 2 files , "classes".
crud class defined methods, problem occurs this.modelname, set routes context changes code:
the question how, same scope under crud have defined modelname ?
server.get('/users/:id', userroutes.find); code:
var db = require('../models'); function crud(modelname) { this.modelname = modelname; this.db = db; } crud.prototype = { ping: function (req, res, next) { res.json(200, { works: 1 }); }, list: function (req, res, next) { // fails because modelname undefined console.log(this); db[this.modelname].findall() .success(function (object) { res.json(200, object); }) .fail(function (error) { res.json(500, { msg: error }); }); } }; module.exports = crud; userroutes class:
var crud = require('../utils/crud'), util = require('util'); var usermodel = function() { usermodel.super_.apply(this, arguments); }; util.inherits(usermodel, crud); var userroutes = new usermodel('user'); module.exports = userroutes;
i assume using userroutes.list handler somewhere else, i.e. context changes. in case should simple solution:
function crud(modelname) { this.modelname = modelname; this.db = db; this.list = crud.prototype.list.bind(this); } note won't able access "the other this" solution (this permamently bound crud instance, no matter how .list called).
the other option turn list function generator (which pretty same .bind does, except can still use this other context):
crud.prototype = { // code list: function() { var = this; return function (req, res, next) { console.log(that); db[that.modelname].findall() .success(function (object) { res.json(200, object); }) .fail(function (error) { res.json(500, { msg: error }); }); } } }; and use userroutes.list() handler.
Comments
Post a Comment