2013-11-14 5 views
0

У меня есть Service и Controller. Контроллер вызывает функцию, getItems() на Service. Service возвращает array данных.Контроллер не запрашивает служебные данные

Однако контроллер, похоже, не получает этого, как ни странно.

Контроллер:

ItemModule.controller('ItemController', ['$scope', 'ItemService', 
    function ($scope, ItemService) { 

     $scope.items = []; 

     $scope.getItems = function() { 
      $scope.items = ItemService.getItems(); 
     } 

     $scope.getItems(); 

    } 
]); 

Услуги:

ItemModule.service('ItemService', ['$rootScope', '$http', 
    function($rootScope, $http) { 

     this.getItems = function() { 
      $http.get($rootScope.root + '/products').success(function(data) { 
       // This prints it out fine to the console 
       console.log(data); 
       return data; 
      }); 
     } 

    } 
]); 

Что я делаю неправильно?

+1

'$ http.get' является асинхронным, а' success' является обратным вызовом. 'return'ing от этого неверно (не делает того, что вы ожидаете от него). Пожалуйста, прочтите следующее: http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call#answer-14220323 –

+2

На данный момент ваша проблема будет решена путем возврата обещания HTTP , то есть: 'return $ http.get (... существующий код без изменений ...)' –

+0

также не возвращает объект, который вы создаете в службе, поэтому, когда вызывается 'ItemService.getItems();' должен видеть ошибку, не определено – charlietfl

ответ

0

Быстрая и грязный исправить будет так:

ItemModule.service('ItemService', ['$rootScope', '$http', 
function($rootScope, $http) { 

    return { 
     getItems : function(scope) { 
      $http.get($rootScope.root + '/products').success(function(data) { 
       scope.items = data; 
      }); 
     } 
    } 

} 
]); 

, а затем в контроллере просто позвоните:

ItemService.getItems($scope); 

Но если ваш контроллер является частью маршрута (и, вероятно, есть) было бы гораздо приятнее использовать resolve (смотрите here).

Смежные вопросы