Angularjs Angular.js延迟AppCtrl和任何路由

Angularjs Angular.js延迟AppCtrl和任何路由,angularjs,routing,angular-ui,deferred,angularjs-bootstrap,Angularjs,Routing,Angular Ui,Deferred,Angularjs Bootstrap,我想延迟AppCtrl的初始化和任何路由更改,直到“应用程序设置”从服务器到达 我使用的是AngularJS样板,其中包括ui路由和ui状态。到目前为止,我发现的任何解决方案都没有推迟AppCtrl启动和路由 除了“at resolve”之外,所有console.log都会在启动时立即启动 Javascript app.js var app = angular.module( 'ngBoilerplate', [ 'templates-app', 'templates-common',

我想延迟AppCtrl的初始化和任何路由更改,直到“应用程序设置”从服务器到达

我使用的是AngularJS样板,其中包括ui路由和ui状态。到目前为止,我发现的任何解决方案都没有推迟AppCtrl启动和路由

除了“at resolve”之外,所有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');
});
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');
});
Javascript foo.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');
});
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');
});

您好,我建议您添加一个工厂服务,并使用它来解决您的参考检查这篇文章刚刚尝试过。我现在有一个工厂,其行为与上面的代码完全相同。AppCtrl是在承诺解决之前启动的。好吧,我不必添加明显绕过解决并立即启动AppCtrl的内容。我仍然对如何在加载应用程序设置之前延迟任何状态更改感兴趣。有几个想法:1)如果没有模板将其配对,状态中的控制器将不会实例化。因此,控制器正在运行的事实可能是一个bug,它会立即运行,因为没有定义模板。2) 使用onEnter而不是控制器和解析。3) 有一个称为加载的状态,当你在oneter或controller中解析你的东西时(无论你决定什么),然后使用$state.transitiono(“homestate”)或任何东西。