0

这是示例代码,两个文件和“类”。

具有已定义方法的 CRUD 类,this.modelName 出现问题,因为我设置了 this 上下文随以下代码更改的路由:

问题是如何在定义 modelName 的 CRUD 下获得相同的范围?

server.get('/users/:id', UserRoutes.find);

代码:

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 the modelName is 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;

用户路由类:

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;
4

2 回答 2

2

我假设您在userRoutes.list其他地方用作处理程序,即上下文发生了变化。在这种情况下,这应该是一个简单的解决方案:

function CRUD(modelName) {
    this.modelName = modelName;
    this.db = db;
    this.list = CRUD.prototype.list.bind(this);
}

请注意,您将无法this使用该解决方案访问“另一个”(无论如何调用,this都将永久绑定到实例)。CRUD.list

另一种选择是list变成一个函数生成器(这几乎是一样的.bind,除了你仍然可以this从其他上下文中使用):

CRUD.prototype = {
    // some code

    list: function() {
        var that = 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 });
                });
        }
    }
};

然后userRoutes.list()用作处理程序。

于 2013-09-24T19:38:46.897 回答
0

这种事情通常是通过将权利存放this_this. 在您的列表函数this中是函数对象,它没有模型名称对象。

var _this; 

function CRUD(modelName) {
    this.modelName = modelName;
    this.db = db;
    _this = this // <---------------
}

.... 
// call the _this in the outer scope 
db[_this.modelName]
于 2013-09-24T19:19:28.087 回答