2016-08-10 5 views
1

Betrachten Sie die folgende Winkelservice:

app.factory('myService', function($http) 
{ 
    var service = 
    { 
     someArray: [], 
     updatePendingIds: function() 
     { 
      console.log(this); 
      $http.get("/get-stuff"). 
       then(function(response) 
       { 
        console.log(this); // someArray is not here! 
       }); 
     } 
    } 
} 

Im ersten console.log vor dem Winkel Versprechen Objekt erstellt „dieses“, das Service-Objekt selbst ist, wie erwartet. Das heißt, es wird einen Schlüssel "someArray" haben.

Aber das zweite Konsolenprotokoll gibt das als $ window -Objekt zurück. Zwei Fragen:

  1. Warum ist dieses $ window, und nicht das Service-Objekt?
  2. Wie gebe ich das Service-Objekt in das $ http-Versprechen ein?

Antwort

1

Es ist, weil Sie einen neuen Kontext erstellt, wenn Sie die Funktion der Verheißung then Methode übergeben erstellt:

then( function(response) // new function context 

Sie werden diese Funktion an das Objekt binden müssen Sie brauchen.

var handleResponse = function(response) { 
    console.log(this); 
}; 

$http.get("/get-stuff").then(handleResponse.bind(this)); 
+0

funktioniert. Folgendes versucht auch, erstellt die "handleResponse" -Funktion als ein Mitglied des Dienstes, aber immer noch nicht gebunden. Musste eigentlich binden. z.B. "handleResponse: function() {...}" und dann später "$ http.get (url) .then (this.handleResponse.bind (this));" Überrascht die "Bind (this)" erforderlich. Warum? –

+0

@RafaelBaptista Dies ist ein häufiges JavaScript-Missverständnis, weil Funktionen erstklassige Objekte sind. Ausführen einer Funktion mit einem Bereich z. 'this.handleResponse()' unterscheidet sich vom Zugriff auf eine Objekteigenschaft, die eine Funktion enthält, z. 'this.handleResponse'. Wenn Sie auf die Eigenschaft zugreifen, erhalten Sie die erste Klassenfunktion, die Sie dem '.then'-Callback übergeben, aber wenn der Callback ausgeführt wird, hat er keinen Gültigkeitsbereich mehr. (Ich hoffe, das macht Sinn; das Konzept ist schwer in einem Kommentarfeld zu erklären. :)) – Stephen

+0

Eigentlich ist der Begriff, den ich suche, "Kontext" nicht Geltungsbereich. Dieser Blog erklärt es gut: http://ryanmorr.com/understanding-scope-and-context-in-javascript/ – Stephen

Verwandte Themen