Я использую this
вместо $scope
для углового приложения, что приводит к трудностям, когда я пытаюсь получить доступ к результатам запроса get
в моем контроллере.
Моя фабрика выглядит так:
app.factory('footballService', function($http) {
return{
getAllTeams : function() {
return $http({
url: 'url',
dataType: 'json'
})
}
}
});
и мой контроллер выглядит так:
app.controller('footballController', function(footballService) {
var footballController = this;
footballService.getAllTeams().success(function(data){
console.log(data); //this data is shown
footballController.teams = data;
});
console.log(footballController.teams); //this is undefined
});
Проблема в том, что я хочу получить доступ к командам вне getAllTeams()
. Может ли кто-нибудь объяснить, как я могу получить доступ к этой переменной? Я думал, установив var footballController = this;
позволит мне получить доступ к этому во всем контроллере, но я должен неправильно понимать, как работает Angular.
Спасибо за любую помощь заранее.
getAllTeams()
возвращает "обещание" - базовые данные недоступны до завершения асинхронного вызова.
Таким образом, вы можете только безопасно получить доступ к данным, которые в пределах .then
обратного вызова (AFAIK .success
осуждается), но она не должна быть такой же, обратный вызов, как тот, в котором вы назначили данные в текущей области:
var promise = footballService.getAllTeams().success(function(data){
console.log(data); //this data is shown
footballController.teams = data;
});
promise.then(function() {
console.log(footballController.teams);
});
$resource
- я радостно использовал $http
везде примерно месяц, прежде чем обнаружил, что $resource
может значительно упростить взаимодействие со службой RESTful.
Переместите консольный вызов в обратный вызов success
.
app.controller('footballController', function(footballService) {
var footballController = this;
footballService.getAllTeams().success(function(data){
console.log(data); //this data is shown
footballController.teams = data;
console.log(footballController.teams); //this is populated now
});
});