Plugin jQuery - Portée de this
Bonjour à tous,
Je suis en train de développer un plugin et j'arrive à un point assez délicat. Pour développer mon plugin, j'utilise la méthode qui est décrite ici.
J'ai donc un objet principal contenant toute mes méthodes qui sert de prototype. Dans certaines méthodes, je vais faire appelle à des fonctions qui vont changer mon mot clé this qui ne fera plus référence à mon objet principal et cela m'ennuie. Par exemple :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| openChannel: function() {
var self = this;
self.connection = new WebSocket(self.options.signallingServer);
// When the connection is open, send some data to the server
self.connection.onopen = self.onChannelOpened;
// Log errors
self.connection.onerror = function (error) {
console.log('WebSocket Error ' + error);
}
// Log messages from the server
self.connection.onmessage = self.onChannelMessage;
self.connection.onclose = self.onChannelClosed;
$(window).unload(function(){ self.connection.close(); self.connection = null });
}, |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| onChannelMessage: function(message) {
var self = this;
self.message = JSON.parse(message.data);
switch(self.message["type"]) {
case "GETROOM" :
self.room = self.message["value"];
self.resetStatus();
break;
case "SDP" :
if (self.message["value"].indexOf("\"ERROR\"", 0) == -1) {
if (!self.guest && !self.started) self.maybeStart();
self.pc.processSignalingMessage(self.message["value"]);
}
break;
case "BYE" :
self.onChannelBye();
break;
}
}, |
Le problème ici est que je ne vais plus pouvoir appeler les méthodes de cette instance d'objet principal car this va référer à mon objet Websocket.
Et si j'essaye de faire ceci :
Code:
1 2 3
| self.connection.onmessage = function() {
self.onChannelMessage.call(self);
} |
Je ne pourrais plus retrouver le message qui est en argument de ma méthode onChannelMessage().
Et je ne veux pas non plus à avoir à mettre ma méthode onChannelMessage() directement dans une fonction anonyme, car je l'utilise à des endroits différents.
Quelqu'un aurait-il une idée sur comment procéder ?
Merci d'avance :)