Ответ 1
Это можно сделать с помощью resolve
в вашем маршрутизаторе.
Это позволяет подождать, пока какой-нибудь promises будет разрешен до того, как контроллер будет запущен.
Цитата из документов:
resolve - {Object. =} - необязательная карта зависимостей, которая должна быть введена в контроллер. Если какая-либо из этих зависимостей promises, маршрутизатор будет ждать, пока все они будут разрешены или один будет отклонен до того, как будет создан экземпляр контроллера. Если все promises успешно разрешены, значения разрешенных promises вводятся и запускается событие $routeChangeSuccess.
Простой пример
app.config(['$routeProvider', function($routeProvider) {
$routeProvider.
when('/', {templateUrl: 'home.html', controller: 'MyCtrl',resolve: {
myVar: function($q,$http){
var deffered = $q.defer();
// make your http request here and resolve its promise
$http.get('http://example.com/foobar')
.then(function(result){
deffered.resolve(result);
})
return deffered.promise;
}
}}).
otherwise({redirectTo: '/'});
}]);
myVar затем будет введен в ваш контроллер, содержащий данные обещания.
Избегание дополнительного параметра DI
Вы также можете избежать дополнительного параметра DI, возвращая службу, которую вы собираетесь вводить в любом случае:
app.config(['$routeProvider', function($routeProvider) {
$routeProvider.
when('/', {templateUrl: 'home.html', controller: 'MyCtrl',resolve: {
myService: function($q,$http,myService){
var deffered = $q.defer();
/* make your http request here
* then, resolve the deffered promise with your service.
*/
deffered.resolve(myService),
return deffered.promise;
}
}}).
otherwise({redirectTo: '/'});
}]);
Очевидно, вам нужно будет сохранять результат из вашего запроса в любом месте общей службы при выполнении подобных действий.
Посмотрите Angular Документы /routeProvider
Я узнал большую часть этого материала от этого парня в egghead.io