2015-06-22 1 views
0

Я использую AngularJS для создания своего веб-приложения, я всегда использовал контроллеры для запроса HTTP, что упрощает и упрощает для меня.Как использовать службу с запросом Http в Angular JS

Но для лучшей структуры кода и лучшего выполнения для моего приложения я хотел использовать службы вместо контроллеров для использования веб-службы.

Я попытался сделать:

var app = angular.module('ofcservices', []); 
app.factory('news', ['$http', function ($http) { 
    var news={}; 

    news.getnews= function() { 
     return $http.get('http://int.footballclub.orange.com/ofc/news?offset=0&limit=5'); 
    }; 

    return news; 
}]); 

и код контроллера:

.controller('news', function($scope, ofcservices) { 
    $scope.news = ofcservices.getnews(); 
}) 

Все, кажется, не так ли?

+3

"Кажется, все в порядке?" - Конечно, просто тестирование это скажет вам об этом? У вас есть причина думать, что это неправильно? – Quentin

+0

$ http is async. Просто проверьте satpals ответ: http://stackoverflow.com/questions/21293235/http-data-from-service-to-controller – nofear87

+0

Вы, кажется, путает с '$ resource' с' $ http.get 'запрос. '$ http.get' возвращает объект, похожий на обещание, который вам нужно будет называть' .then'. '$ resource' позволит вам сделать это, но вам нужно будет включить его в качестве модуля – CodingIntrigue

ответ

3

ofcservices.getnews()is a promise Вам нужно управлять с помощью функции Sucess и ошибок

ofcservices.getnews(). 
    success(function(data) { 
    $scope.news=data 
    }). 
    error(function(data, status, headers, config) { 
    //show a error 
    }); 

как изменение Weel app.factory('news' к app.factory('newsFactory' и назвать его в controller('news', function($scope, newsFactory) {

Вы можете получить больше данных о promise in the angular documentation

+0

Спасибо за ваш ответ! У меня есть ошибка: '' Ошибка: [$ injector: unpr] Неизвестный поставщик: ofcservicesProvider <- ofcservices <- news' –

+2

@YasserB. Вам нужно переименовать свою службу, чтобы она не совпала с вашим контроллером, newsService' вместо 'ofcservices' как' ofcservices' - это имя вашего модуля – CodingIntrigue

+0

У вас есть обновление с примечаниями @RGraham –

1

Концепция более или менее прав, но вы должны использовать функции обратного вызова для правильной обработки ответа HTTP.

Но ваш контроллер и служба имеют одно и то же имя news, что НЕОБХОДИМО :-), и вам необходимо ввести newsService, а не имя модуля.

.controller('newsController', function($scope, newsService) { 
    newsService.getnews().then(
     function(newsData) { 
     $scope.newsData = newsData 
     }, 
     function optionalErrorhandler() {}); 
}) 
0
angular 
      .module('MyApp', []) 
      .controller('MyController', MyController) 
      .factory('MyService', MyService); 

      MyController.$inject = ['$scope','MyService']; 
      MyService.$inject = ['$http']; 

      function MyService($http){ 
       var service = { 
        var myServiceFunction : function(){ 
         $http({ 
          // your http request on success return the data. 
         }).success(function(data)){ 
          return data; 
         }); 
        } 
       }; 
       return service; 

      } 

function MyController($scope, MyService){ 
    MyService.myServiceFunction(); //Call service from the controller. 
}