Я хотел бы отложить инициализацию AppCtrl и любое изменение маршрута до тех пор, пока с сервера не поступят «настройки приложения».
Я использую шаблон AngularJS, который включает ui-route и ui-state. Ни одно из решений, которые я нашел до сих пор, на самом деле не откладывало запуск AppCtrl и маршрутизацию.
Все console.log срабатывают сразу при запуске, кроме «при разрешении».
Javascript app.js
var app = angular.module( 'ngBoilerplate', [
'templates-app',
'templates-common',
'ngBoilerplate.foo',
'ui.state',
'ui.route'
]);
app.config( function myAppConfig ( $stateProvider, $urlRouterProvider, $translateProvider ) {
console.log('greetings from config');
// Routes
$stateProvider.state('home', {
controller:"AppCtrl",
resolve:{
app: function ($q, $timeout) {
var defer = $q.defer();
console.log('before resolve');
$timeout(function () {
console.log('at resolve');
defer.resolve();
}, 2000);
return defer.promise;
}
}
});
$urlRouterProvider.when('/foo','/foo/tile');
$urlRouterProvider.otherwise( '/foo' );
});
app.run(function run( $rootScope, $state, $stateParams, titleService, dataFactory ) {
console.log('greetings from run');
$state.transitionTo('home');
});
var AppCtrl = app.controller( 'AppCtrl', function AppCtrl ( $scope, $location ) {
console.log('greetings from AppCtrl');
});
JavaScript foo.js
angular.module( 'ngBoilerplate.foo', [
'ui.state',
'placeholders',
'ui.bootstrap'
])
.config(function config( $stateProvider ) {
$stateProvider
.state( 'foo', {
url: '/foo/:type',
views: {
"navigation": {
templateUrl: "navigation/navigation.tpl.html"
},
"footer": {
templateUrl: "navigation/footer.tpl.html"
},
"main": {
controller:'FooCtrl',
templateUrl: function(stateParams) {
if(stateParams.type == null) {
stateParams.type = 'tile';
}
return "foo/foo."+(stateParams.type == null || stateParams.type == 'tile' ? 'tile' : 'list')+".tpl.html";
}
}
}
})
.controller( 'FooCtrl', function FooCtrl( $scope ) {
console.log('deferred FooCtrl');
});