2016-11-15 82 views
2

我想分享socket.io到我的財產,不知道爲什麼它不工作...原型模式創建新的屬性

我的第一個文件,MessageController.js

function MessageController() { 
}; 

MessageController.prototype.io = ""; 

MessageController.prototype.sendMessageAction = function (req, res) { 
    console.log(this.io); 

} 

module.exports = new MessageController(); 

在另一個文件router.js我有像這樣:

var messageController = require('./controllers/MessageController'); 


module.exports = function (expressApp, router, io) { 
    console.log(io); 

    messageController.io = io; 

    router.post('/dashboard/message', messageController.sendMessageAction); 

    return router; 
}; 

這裏是我需要router.js

module.exports = function (expressApp, io) { 
    var router = system.express.Router(); 

    router = require('./dashboard/router.js')(expressApp, router, io); 

    return router; 


}; 

而當我呼叫路線this.io財產返回undefined任何人都知道什麼是問題?

+0

它看起來像你可能它router.js 嘗試被設置爲undefined : module.exports =功能(expressApp,路由器,IO){ 的console.log(IO); // undefined .... }; –

+0

這不是bacause udefined,我取代'io'用字符串,但同樣的結果... – Vladimir

+0

你router.js 設置之前,取而代之的是你嘗試登錄它,就像我建議? –

回答

1

這裏的問題是關於範圍如何在JavaScript中工作的誤解。當router調用messageController.sendMessageAction時,它使用綁定。 e.g:

callback(res, req, next) 

在這種情況下,電流範圍不是messageController。所以this不是指messageController。如果你想this綁定messageController你必須綁定sendMessageAction它。

// Using Function#bind 
router.post(
    '/dashboard/message', 
    messageController.sendMessageAction.bind(messageController) 
) 

// Using a closure 
router.post(
    '/dashboard/message', 
    (req, res) => messageController.sendMessageAction(req, res) 
) 
+0

那麼這裏是誰呢? 路由器? 因爲這個方法被刪除了嗎? –