我可能会有某种误解。我使用角度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什么都不做,我无法弄清楚为什么,你能帮助并解释我...
答案 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');
并且它有效......