module.run()和$ state.go()angularJS

时间:2014-10-14 07:39:04

标签: javascript angularjs

我可能会有某种误解。我使用角度ui路由器,我有下一个问题:

我有下一个州提供者:

angular
.module('MainApp')
.config(['$stateProvider', '$urlRouterProvider', function ($stateProvider, $urlRouterProvider ) {
    $stateProvider
        .state('register', {
            url: "/",
            abstact: true,
            views: {
                "side-bar": {
                    controller: "GetSideBarCtrl"
                },
                "page-body@register": {
                    templateUrl: "/App/Views/WelcomePage.html"
                }
            },
        })
        .state('register.Register', {
            url: "Register",
            views: {
                "page-body": {
                    controller: "RegisterCtrl",
                    templateUrl: "/App/Views/Register.html"
                }
            },
        })
        .state('register.Login', {
            url: "Login",
            views: {
                "page-body": {
                    controller: "LoginCtrl",
                    templateUrl: "/App/Views/Login.html"
                }
            },
        })
        //For registered and loged in users!
    /* */
        .state('main', {
            url: "/:userId",
           // abstact: true,
            views: {
                "side-bar": {
                    controller: "GetSideBarCtrl"
                },
                "page-body@main": {
                  //  controller: "LoginCtrl",
                    templateUrl: "/App/Views/MainPage.html"
                }
            },
        });
    $urlRouterProvider.otherwise('/');
}]);

并运行功能

angular
.module('MainApp')
.run(['$rootScope', '$state', '$cookieStore', 'principal',
function ($rootScope, $state, $cookieStore, principal) {
    var cookies = $cookieStore.get('user');
    if (cookies) {
        principal.Authenticate(cookies.split(' ')[0], cookies.split(' ')[1]);
        $state.go('main', { userId: cookies.split(' ')[0] });
    } else {
        $state.go('register.Login');
    }
}]);

一切正常,当存在cookie并且验证工作没有任何问题但$ state.go什么都不做,我无法弄清楚为什么,你能帮助并解释我...

7 个答案:

答案 0 :(得分:25)

是的,正如所建议的那样,$ state.go()在module.run()中无法正常工作。

我发现将$ state代码放在$ timeout中就可以了,例如

angular.module('MainApp').run($timeout, $state, ...) {

    $timeout(function() {
        $state.go('main');
    });

}

答案 1 :(得分:4)

所以我以不同的方式使它工作,我使用了$ stateChangeStart,现在我的run函数看起来像这样:

angular
.module('MainApp')
.run(['$rootScope', '$state', '$cookieStore', 'principal',
    function ($rootScope, $state, $cookieStore, principal) {
        var cookies = $cookieStore.get('user');
        if (cookies) {
            principal.Authenticate(cookies.split(' ')[0], cookies.split(' ')[1]);
        }
        $rootScope.$on('$stateChangeStart',
            function (event, toState) {
                if ((toState.name === "register") && (principal.isAuthenticated)) {
                    event.preventDefault();
                    $state.go('main', { userId: principal.identity().userId });
                }
            });
    }
]);

但我仍然不知道为什么$ state.go()没有工作......

答案 2 :(得分:3)

我遇到了完全相同的问题 我正在使用ionic来构建一个跨平台的移动应用程序 我有逻辑 - >如果用户已登录。重定向到主页面,否则重定向到登录页面

if(isLogin("userId")){
    $state.go("main");
}else{
    $state.go("login");
}

这项工作完全适用于Android,但偶尔会在IOS上崩溃。经过一番调查研究。我使用$ location.path而不是$ state.go,一切正常。

if(isLogin("userId")){
    $location.path("/main");
}else{
    $location.path("/login");
}

希望这可以帮助您解决问题。

答案 3 :(得分:1)

$ state.go在运行中不起作用,它尚未初始化!我所做的是在服务中抛出逻辑,将控制器添加到运行的模块中,在控制器中运行它!这应该有用。

答案 4 :(得分:1)

请注意遵循this thread的建议,您也可以解决此问题,为此改变其他方法:

  $urlRouterProvider.otherwise(function ($injector, $location) {
    var $state = $injector.get("$state");
    $state.go("/");
  });

希望有所帮助

答案 5 :(得分:0)

我遇到了类似的问题。 $ state.go无法在.run函数中工作。

在服务中放置$ state.go解决了我的问题。

答案 6 :(得分:0)

这听起来很奇怪,但对我来说解决方案是重命名我的状态并移除点......

我希望主页与客户,导演,经理或其他任何东西不同(但使用相同的网址)

  .state('home', {
    url : '/',
    templateUrl: 'views/home.html',
    controller: 'HomeCtrl',
    controllerAs: 'home',
    module :'private'
  })
  .state('home.customer', {
    url : '',
    templateUrl: 'views/home-customer.html',
    controller: 'HomeCustomerCtrl',
    controllerAs: 'homeCustomer',
    module :'private'
  })

  .run(function ($rootScope, $state, $window,userService) {
    $rootScope.$on("$stateChangeStart", function(e, toState, toParams, fromState, fromParams) {
     if(toState.name === 'home') {
          if(userService.isCustomer()) {
               $state.go('home.customer');
         }
      }
}

这不起作用,将名称home.customer状态替换为home-customer$state.go('home-customer');并且它有效......