2014-11-21 2 views
0

У меня есть приложение AngularJS и есть требование инициализировать данные из REST API до инициализации контроллера. Я использую «разрешение» в routeProvider, а также вводил соответствующее значение в контроллер, чтобы сделать эти данные доступными. Фрагменты кода заключаются в следующем:

RouteProvider фрагмент кода:

myApp.config(function($routeProvider) { 
    $routeProvider 
.... 
.when('/account', { 
     templateUrl : path + 'admin/js/pages/inputs/account.html', 
     controller : 'mainController', 
     resolve: { 
      data: function() { 
       return $http.get(api_path + 'dashboard/get_accounts'); 
      } 
     } 
    }) 

myApp.controller('mainController', function($scope,$http, data, $routeParams, DataService) { 
... 
console.log(data); 
} 

Консоль предполагается отображать данные по я получаю следующее сообщение об ошибке "Ошибка: [$ Инжектор: unpr] Неизвестный поставщик: DataProvider < - данные "

Ваша помощь очень ценится.

+0

Хотя это не соответствует ошибке вы получаете, похоже, что вы забыли, чтобы ввести '$ http' в функцию Resolve для' data'. Не должно быть что-то вроде этого: 'data: function ($ http) {....}' –

+0

На самом деле у него есть $ http-инъекция Sunil, я не включил его здесь для краткости –

ответ

0

Это потому, что поставщик данных еще не создан, и он создает экземпляр контроллера до того, как поставщик готов, проходящий через неопределенный и неизвестный провайдер.

Try что-то подобное, что возвращает обещание:

myApp.config(function($routeProvider, $q) { 
    $routeProvider, $q 
.... 
.when('/account', { 
     templateUrl : path + 'admin/js/pages/inputs/account.html', 
     controller : 'mainController', 
     resolve: { 
      data: function() { 
       return $q.all($http.get(api_path + 'dashboard/get_accounts')); 
      } 
     } 
    }) 

Теперь контроллер не будет экземпляр, пока обещание не решен полностью. В соответствии с документацией для $ routeProvider и тем, как она обрабатывает обещания в решении.

$routeProvider на сайте ANGULAR в

resolve - {Object.=} - An optional map of dependencies which should be injected into the controller. If any of these dependencies are promises, the router will wait for them all to be resolved or one to be rejected before the controller is instantiated. If all the promises are resolved successfully, the values of the resolved promises are injected and $routeChangeSuccess event is fired. If any of the promises are rejected the $routeChangeError event is fired.

+0

Но [$ http. get()] (https://docs.angularjs.org/api/ng/service/$http#get) уже возвращает обещание. Так что это не должно быть необходимым, и проблема, кажется, в другом месте ... Или я чего-то не хватает? –

+0

Причина, по которой я говорю, говорит, что это потому, что ваше обещание $ http не разрешается. То, что я рекомендую, принимает вызов $ http и помещает его в службу для вас, чтобы решить обещание, прежде чем оно будет использоваться в вашем маршруте. Посмотрите примеры здесь: http://odetocode.com/blogs/scott/archive/2014/05/20/using-resolve-in-angularjs-routes.aspx и то, как они разрешают обещание, прежде чем оно будет включено в ваш routeProvider. разрешить. – TommyMac

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