Here is the app.js of my project:
这是我的项目的app.js:
(function () {
'use strict';
angular
.module('app', ['ui.router', 'ngCookies', 'angular-inview', 'ngMaterial'])
.config(config)
.run(run);
config.$inject = ['$stateProvider', '$urlRouterProvider', '$mdThemingProvider'];
function config($stateProvider, $urlRouterProvider, $mdThemingProvider) {
$mdThemingProvider.theme('default')
.primaryPalette('deep-orange')
.accentPalette('teal', {
'default': 'A400'
});
$urlRouterProvider.otherwise('/app');
$stateProvider
.state('app', {
url: '/app',
data: {
clearenceLevel: 1
},
views: {
'': {
templateUrl: 'app/views/navbar.html',
}
}
})
.state('home.works', {
url: '/works',
templateUrl: 'app/views/works.html',
controller: 'WorksController as vm'
})
.state('login', {
url: '/login',
templateUrl: 'app/views/login.html',
controller: 'LoginController as vm',
data: {
clearenceLevel: 0
}
})
.state('register', {
url: '/register',
templateUrl: 'app/views/register.html',
controller: 'RegisterController as vm',
data: {
clearenceLevel: 0
}
});
}
run.$inject = ['$rootScope', '$location', '$state', '$cookieStore', '$http', 'AuthenticationService'];
function run($rootScope, $location, $state, $cookieStore, $http, AuthenticationService) {
$rootScope.globals = $cookieStore.get('globals') || {};
if ($rootScope.globals.currentUser) {
$http.defaults.headers.common['aimm-token'] = $rootScope.globals.currentUser.token;
$http.defaults.headers.common['aimm-id'] = $rootScope.globals.currentUser.id;
}
$rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {
var clearenceLevel = toState.data.clearenceLevel;
var loggedIn = $rootScope.globals.currentUser;
if (clearenceLevel > 0 && !loggedIn) {
alert("redirecting");
return $state.go('login');
}
});
}
})();
I just can't have $state.go() working. The $on('$stateChangeStart'...);
is working fine, and the alert is poping when trying to reach a protected state with no session. But the return $state.go('login');
doesnt work. It redirects to /app
.
我只是不能让$ state.go()工作。 $ on('$ stateChangeStart'...);工作正常,当尝试达到没有会话的受保护状态时,警报会弹出。但是返回$ state.go('login');不起作用。它重定向到/ app。
Thanks for your help.
谢谢你的帮助。
2 个解决方案
#1
10
Well, thanks to @Vanojx1, I found out adding e.preventDefault();
before the $state.go('login');
made it work. Still dont understand why though.
好吧,多亏了@ Vanojx1,我发现添加了e.preventDefault();在$ state.go('login')之前;使它工作。仍然不明白为什么。
#2
5
You need to execute the $state.go
on main scope and not in a (angular) service or virtual scope created temporarily.
您需要在主范围上执行$ state.go,而不是在临时创建的(角度)服务或虚拟范围中执行。
You can also solve the problem by wrapping it in $timeout
or setTimeout
which will register it in the browser loop to be executed after the current method run etc even with 0 milliseconds will do it, like.
您也可以通过将其包装在$ timeout或setTimeout中来解决问题,这将在浏览器循环中将其注册,以便在当前方法运行之后执行等,即使用0毫秒也可以执行此操作,例如。
$timeout(()=>{$state.go('xyz')},0)
or
setTimeout(()=>{$state.go('xyz')},0);
#1
10
Well, thanks to @Vanojx1, I found out adding e.preventDefault();
before the $state.go('login');
made it work. Still dont understand why though.
好吧,多亏了@ Vanojx1,我发现添加了e.preventDefault();在$ state.go('login')之前;使它工作。仍然不明白为什么。
#2
5
You need to execute the $state.go
on main scope and not in a (angular) service or virtual scope created temporarily.
您需要在主范围上执行$ state.go,而不是在临时创建的(角度)服务或虚拟范围中执行。
You can also solve the problem by wrapping it in $timeout
or setTimeout
which will register it in the browser loop to be executed after the current method run etc even with 0 milliseconds will do it, like.
您也可以通过将其包装在$ timeout或setTimeout中来解决问题,这将在浏览器循环中将其注册,以便在当前方法运行之后执行等,即使用0毫秒也可以执行此操作,例如。
$timeout(()=>{$state.go('xyz')},0)
or
setTimeout(()=>{$state.go('xyz')},0);