2014-12-19 2 views
1

У меня есть прокси-сервер для экспресс-доставки. Он проверяет заголовок, и если все круто это вызывает next()Быстрое связывание с машинописным текстом

Теперь, когда я нахожусь в «DoSomething», «это» равно глобальному, а не экземпляру «Test» и «this.DoSomeThingPrivate» не определено.

Я попытался рисунок

DoSomeThingPrivate :() => void; 

this.DoSomeThingPrivate =() => { 
... 
} 

. Но и не работает.

import express = require('express'); 

var app = express(); 

class Test {  
    constructor() {   
    } 

    DoSomething(req:express.Request, res:express.Response, next:Function) :void {  
     this.DoSomeThingPrivate(); 
    } 

    private DoSomeThingPrivate() :void 
    {  
    } 
} 

var test = new Test(); 

app.use(test.DoSomething); 

Relates to this

Любые идеи ...

благодаря

ответ

5

Вы Передает ссылку только на саму функцию. Экземпляр функции будет глобальным. Вам нужно связать функцию с экземпляром test.

app.use(test.DoSomething.bind(test)); 
+0

спасибо, что парень, который работал. Я все еще использую машинописный текст – Pintac

+0

Не беспокойтесь. Однако это не проблема с машинописным шрифтом. Вы обнаружите, что это обычно происходит в JavaScript. – johngeorgewright

+0

В дополнение к этому ответу и ответу @ basarat, здесь [большое описание «this» в TypeScript] [1], в котором описывается причина проблемы, предлагаемые здесь решения и компромиссы при выборе одного из них. [1]: https://github.com/Microsoft/TypeScript/wiki/'this'-in-TypeScript – AronVanAmmers

5

должно работать нормально, т.е. использовать жирную стрелку DoSomething не DoSomethingPrivate:

import express = require('express'); 

var app = express(); 

class Test {  
    constructor() {   
    } 

    // important: 
    DoSomething = (req:express.Request, res:express.Response, next:Function) => {  
     this.DoSomeThingPrivate(); 
    } 

    private DoSomeThingPrivate() :void 
    {  
    } 
} 

var test = new Test(); 

app.use(test.DoSomething); 

Примечание: Вы не должны использовать bind. Также https://www.youtube.com/watch?v=KDrWLMUY0R0&hd=1

+3

вы также можете использовать тип 'express.NextFunction' для параметра' next'. –

+1

Я думаю, что этот подход значительно лучше, чем 'bind'. – djejaquino