2015-05-16 4 views
5

Ich habe einfache Winkel js Controller eine XHR Anfrage wie untenWie kann ich auf das "Dies" eines eckigen js-Controllers zugreifen, von innen eine Verheißungsmethode?

app.controller('MainController', ['$http', function($http) { 

    this.php_response = {}; 

    var promise = $http.get('process.php'); 

    promise.then(
     function(success_data) { 

      // I dont think "this" is talking to the controller this anymore?  
      this.php_response = success_data; 

     }, function(error) { 
      console.log('there was a problem'); 
     } 
    ); 

}]); 

machen Wenn ich diesen Controller schrieb dies mit $scope statt der Code gearbeitet, jetzt die this.php_response Eigenschaft nicht die Daten aus dem XHR Anfrage abgerufen enthält.
Ich vermute, die promise.then#success Callback verweist nicht mehr auf den Controller this.
Wie kann ich Zugang zu dieser, innerhalb der Verheißungsmethode?

Antwort

9

Verwenden arrow function die lexikalischen Kontext bewahrt:

promise.then(success_data => { 
    this.php_response = success_data; 
}, error => { 
    console.log('there was a problem'); 
}); 

Eine weitere einfache Möglichkeit ist Zusammenhang mit Function.prototype.bind Methode zu binden:

promise.then(function(success_data) { 
    this.php_response = success_data; 
}.bind(this), function(error) { 
    console.log('there was a problem'); 
}); 

Und schließlich Altschule Weg: Bezugsgröße zeigt auf äußere definieren this und verwenden Sie es innerhalb des Rückrufs:

var self = this; 

promise.then(function(success_data) { 
    self.php_response = success_data; 
}, function (error) { 
    console.log('there was a problem'); 
}); 

Was auch immer Sie bevorzugen mehr.

+0

dank verwenden können, fand ich sie beide arbeiteten, 'var self = this;' sofort sinnvoll, so werde ich mit, dass in der Zukunft gehen! –

1

Sie auch angular.bind für diesen Fall

promise.then(angular.bind(this, function (success_data) { 
    this.php_response = success_data; 
}), function (error) { 
    console.log('there was a problem'); 
}); 
Verwandte Themen