Angular.js откладывает AppCtrl и любую маршрутизацию

Я хотел бы отложить инициализацию 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');
});

person Kilian Schefer    schedule 15.08.2013    source источник
comment
Привет, я предлагаю вам добавить фабричную службу и использовать ее в разрешении для справки, проверьте этот пост разрешить" title="возврат взаимозависимых асинхронных обещаний в разрешении поставщика маршрутов"> stackoverflow.com/questions/18010796/   -  person JQuery Guru    schedule 15.08.2013
comment
Только что попробовал это. Теперь у меня есть фабрика, которая ведет себя точно так же, как мой код выше. AppCtrl запускается до промиса.   -  person Kilian Schefer    schedule 15.08.2013
comment
Хорошо, мне не нужно было добавлять ‹div ng-controller=AppCtrl›‹/div›, что, очевидно, обошло разрешение и сразу же запустило AppCtrl. Мне все еще интересно, как я могу отложить любое изменение состояния до загрузки настроек приложения.   -  person Kilian Schefer    schedule 15.08.2013
comment
Несколько идей: 1) Контроллеры в состояниях не будут создаваться без шаблона для их сопряжения. Так что, возможно, тот факт, что контроллер вообще работает, является ошибкой, и он запускается сразу, потому что шаблон не определен. 2) Используйте onEnter вместо контроллера и разрешения. 3) Имейте состояние, называемое загрузкой, и когда вы разрешаете свои вещи в onEnter или контроллере (независимо от того, что вы решите), используйте $state.transitionTo(homestate) или что-то еще.   -  person Tim Kindberg    schedule 16.08.2013