J'enveloppé (-côté client) socket.io dans une classe prototype:contexte original 'ceci' avec Socket.IO
Chat.Client = Class.create();
Chat.Client.prototype = {
initialize: function() {
...
this.socket.on('message', this.on_message);
...
},
on_message: function(data) {
this.add_chat_message(data.something);
}
do_something: function(something) {
...
}
Cela ne fonctionne pas parce que 'ceci' dans ON_MESSAGE sera 'SocketNamespace' . Traditionnellement, je voudrais contourner ce problème en passant simplement 'this' dans le callback en tant que paramètre supplémentaire, mais comme j'utilise socket.io, je ne peux pas le faire simplement.
Comment puis-je résoudre ce problème?
Merci, bind fonctionne. (maintenant je vais devoir attendre 8 minutes pour accepter votre réponse) –
Content de vous aider. – Pointy
Petit ajout: les bibliothèques JS connues fournissent des fonctionnalités de liaison. Si l'on utilise [underscore.js] (http://underscorejs.com), il y a une fonction crossbrowser 'bind':' _.bind (function() {...}, this) '. Il y a aussi la fonction 'proxy' dans jQuery, qui fait la même chose:' $ .proxy (function() {...}, this) '. Voici un [test de performance avec des exemples] (http://jsperf.com/bind-vs-jquery-proxy/5) pour tous les moyens de le faire. – HighCat