2015-05-16 25 views
5

Mam prosty kontroler kątowe js składając wniosek XHR jak poniżejJak mogę uzyskać dostęp do "tego" kontrolera kątowego js, ​​od wewnątrz metody obietnicy?

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'); 
     } 
    ); 

}]); 

Kiedy pisałem ten kontroler używając $scope tego kodu działało, teraz własność this.php_response nie zawierający dane pobrane z żądania użyciem nagłówków XHR zamiast.
Podejrzewam, że wywołanie zwrotne promise.then#success nie odwołuje się już do kontrolera this.
Jak uzyskać dostęp do tej metody obietnicy?

Odpowiedz

9

Zastosowanie arrow function zachowuje kontekst leksykograficznego:

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

Innym prostym sposobem jest łączenie kontekst z Function.prototype.bind sposób:

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

i wreszcie starej szkoły sposób: określenia referencyjnego zmienną wskazującą na zewnętrznej this i użyj go wewnątrz oddzwonienia:

var self = this; 

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

Cokolwiek wolisz więcej.

+0

dzięki znalazłem oboje pracowali, 'var = to samo;' razu sens, więc pójdę z tym w przyszłości! –

1

Można również użyć angular.bind dla tej sprawy

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