2011-03-07 20 views
5

Estoy usando "socket.io" en mi servidor nodejs. ¿Hay alguna forma de ejecutar las funciones de eventos registradas en el alcance de mi clase/módulo (en el navegador)?Cómo vincular el controlador de eventos de socket.io (en nodejs) a mi propio ámbito?

... 
init: function() { 
    this.socket = new io.Socket('localhost:3000'); //connect to localhost presently 
    this.socket.on('connect', this.myConnect); 
}, 
myConnect: function() { 
    // "this.socket" and "this.f" are unknown 
    // this.socket.send({}); 
    // this.f(); 
}, 
f: function() { 
    // ... 
} 
... 

Respuesta

14

I que V8 apoya la "bind()" función:

this.socket.on('connect', this.myConnect.bind(this)); 

La llamada de "atar" devolverá una función que se llame su función tal que this se establece al argumento que pase (en este caso, this desde el contexto de la llamada a esa función "init").

edit — "bind()" está en el prototipo de función en Chrome, así que imagino que funciona bien en el nodo.

Esto es lo que se puede tratar en un navegador (uno que tiene la función disponible, como Chrome):

var f = (function() { alert(this); }).bind("hello world"); 
f(); 
+0

Desafortunadamente no tengo Chrome para probarlo y no funciona en Firefox. ¿Hay otra manera? – koalabruder

+0

Bueno, pruébalo en Node.js entonces - debería funcionar. – Pointy

+0

También debería probar Chrome, es un buen navegador y muy rápido :-) – Pointy

3

lo he resuelto en mi contexto YUI3 con

this.socket.on('connect', Y.bind(this.myConnect, this)); 

Gracias a puntiagudo para la palabra "atar".

Cuestiones relacionadas