Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Duvida sobre escopo do THIS

Olá, minha duvida é mais conceitual.

Imagine que eu tenho um arquivo de rota que chama um método de listagem em um controller:

app.get('/listar', app.controllers.fotoController.listar);

Agora no controller eu escrevo como classe

FotoController = function() {
    this.model = require('mongoose').model('Foto');
};

FotoController.prototype.listar = function(req, res) {
    this.model.find({})......
};

module.exports = new FotoController();

Dessa forma a listagem não funciona pois o THIS do método listar não é o proprio objeto FotoController mas sim o objeto do express.

Isso acontece pois agora o this é sempre referente a quem chama a função e não ao contexto fechado do objeto.

Caso eu queira que esse mesmo codigo funcione eu tenho que atrelar a instancia através de um BIND la na minha chamada na rota

app.get('/listar', app.controllers.fotoController.listar.bind(app.controllers.fotoController));

Dessa forma o this dentro do metodo listar fica sendo a instancia do fotoController e não o objeto do express. Fazendo tudo funcionar.

Minha pergunta é: Existe alguma forma de mudar esse comportamento ? ou eu sempre vou ficar refem de dar esse bind passando o contexto ?

Sempre trabalhei com classes js escritas dessa forma e o this não funcionava dessa maneira. Agora no node estou enfrentando essa dificuldade.

2 respostas

This tem escopo dinâmico e arrow function tem escopo léxico. Talvez isso possa lhe ajudar.

solução!

Opa, pelo que eu me lembro, esse projeto usa o módulo do no node que carrega e escopa todos os seus arquivos, dada uma configuração.. Acho que é aí que está o problema...

Se no lugar onde vc declara a rota, vc usar um require tradicional, algo como

var fotoController = require('./fotoCotroller');

O módulo vai retornar o que foi atribuido para o exports e tudo vai dar certo.

Flavio respondeu logo depois, ele manja mais :).