2017-03-28 1 views
0

Ich hatte eine ähnliche Frage, aber nicht das Gleiche. Dieser konzentriert sich auf das neue ES6-Klassenschlüsselwort und wie man damit umgeht. SignalR ruft eine Klassenmethode auf. Innerhalb dieser Klassenmethode bezieht sich 'this' auf den SignalR-Hub und nicht auf die Klasseninstanz selbst. Wie kann ich die Klasseninstanz in diesem Klassenmitglied abrufen, die SignalR mit den neuen ES6-Klassen aufgerufen hat?SignalR Klassenmethode Rückruf und 'dies'

class gameLoad { 
    constructor(){ 

    } 

    init(){ 
     // create the network object and hook it's functions update for loading 
     this.network = $.connection.testHub; 
     this.network.client.hello = this.sayHello; 
    } 

    // this is called from signalR and 'this' now refers to the signalR hub inside this function. how can I get the class instance? 
    sayHello(){ 
     console.log(this); // 'this' refers to signalR object not gameLoad object 
    } 

    create(){ 
     var self = this; 
     $.connection.hub.start().done(function() { 
      console.log("Started!") 
      console.log("Calling server function."); 

      // make our first network call which will turn around and call client.hello which is bound to this classes sayHello() member function 
      self.network.server.hello(); 
     }); 
    } 
} 
+0

Dies nichts mit ES6 Klassen hat, funktionierte es genau die gleiche Art und Weise in ES5. – Bergi

Antwort

1

Wenn Klassen verwenden, ist es am besten Pfeil Funktionen zu verwenden, so dass Sie ‚dies‘ richtig eingestellt haben.

In Ihrem Beispiel weisen Sie sayHello der Hallo-Methode des Clients zu. Sie müssen gameLoad zu dieser Zeit, um es zu binden:

this.network.client.hello = this.sayHello.bind(gameLoad); 

Alternativ Sie sayHello in einen Pfeil Funktion umwandeln kann:

sayHello =() => { 
+0

OK, also ruft bind() 'this' dann in dieser Funktion auf? Ich bin kein großer Fan der Pfeilfunktionssyntax, aber ich werde diese ausprobieren. – user441521