2013-09-24 130 views
0

以下是示例代碼,兩個文件和「類」。此範圍因繼承而丟失

與定義的方法CRUD類,與this.modelName出現問題,因爲我設置這種情況下,此代碼更改路線:

的問題是如何,得到CRUD在相同的範圍,你已經定義了modelName?

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; 

UserRoutes類:

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; 
+2

是什麼問題? –

+0

我無法重現您的錯誤。 'console.log(this);'按預期工作。爲什麼不呢?除非你使用'userRoutes.list'作爲處理程序? – freakish

+0

@freakish我認爲他的評論是在錯誤的行上,應該是2行下降 – jcollum

回答

2

我假設你使用userRoutes.list作爲其他地方的處理程序,即上下文更改。在這種情況下,這應該是一個簡單的解決方案:

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

請注意,您將無法訪問「其他this」用該溶液(this將permamently勢必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()作爲處理程序。

+0

目前作爲解決方案最好的答案適用於多個實例! –

0

這種事情通常是由充填權this_this固定。在你的列表函數this中是函數對象,它沒有modelName對象。

var _this; 

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

.... 
// call the _this in the outer scope 
db[_this.modelName] 
+0

好的答案凍結舊範圍聲明變量範圍似乎是工作和唯一的解決方案在這種情況下。 –

+1

是的,如果您認爲沒有其他「CRUD」實例,那麼答案很好。 – freakish

+0

@在那裏有種讚揚的恭維話;還是被動的侵略性刺拳? – jcollum