1

Я использую фабрику для извлечения данных с использованием $http и возможностей controllerAs для ввода в мой вид. Без использования $scope у меня возникают проблемы с возвратом данных ответа $http в свойство моего контроллера.AngularJS: Возврат. Then() ответ на свойство контроллера

Моя фабрика

myApp.factory('Topics', function ($http, $q) { 
    var service = {}, 
     _error = 'Oh no! Something went wrong. Please check back later.'; 


    service.getTopics = function() { 
     var deferred = $q.defer(); 

     $http.get(_url).success(function (resp) { 
      deferred.resolve(resp); 
     }).error (function() { 
      deferred.reject(_error); 
     }); 
     return deferred.promise; 
    } 

    return service; 
}); 

Мой контроллер

myApp.controller('TopicsCtrl', function (Topics) { 
    this.topics = (function() { 
     return Topics.getTopics().then(function (resp) { 
      console.log(resp); 
      return resp; 
     }); 
    })(); 
} 

Мой Посмотреть

<h1>{{ top.topics }}</h1> 

Как я уже сказал, я использую controllerAs на моем маршруте, который настроен на top. console.log в контроллере регистрирует то, что я ищу, но значение topics пуст, когда оно вводится в представление. Оставив меня с {}.

P.S. Из того, что я понимаю $http это абстракция $q которая заставляет меня задаться вопросом, если используется $q в этом примере не является необходимым.

ответ

4

должно работать:

myApp.controller('TopicsCtrl', function (Topics) { 
    Topics.getTopics().then(function (resp) { 
     this.topics = resp; 
    }.bind(this)); 
    }); 

Тогда доступ к нему на ваш взгляд через top.topics.

Edit: Кроме того, вы правы, не нуждаясь $ Q в службе. Вы можете просто вернуть $ http.get напрямую:

service.getTopics = function() { 
    return $http.get(_url); 
}; 
+0

Спасибо это сработало! –

0

Вы сделали, чтобы инициализировать top.topics с обещанием. Но угловые взгляды ничего не могут сделать с обещаниями. Им нужны фактические данные, доступные, когда обещание будет разрешено. Так что вам нужно:

// oh the joys of this... 
var that = this; 

Topics.getTopics().then(function (resp) { 
    console.log(resp); 
    that.topics = resp; 
}); 

Обратите внимание, что вы могли бы использовать обещание цепочки в службе:

return $http.get(_url).then(function (resp) { 
     return resp.data; 
    }).catch(function() { 
     return $q.reject(_error); 
    }); 
Смежные вопросы