Angularjs ui-router. Jak przekierować na stronę logowania
Mam 4 Stany: dashboard, dahboard.główna, deska rozdzielcza.drobne, login . pulpit nawigacyjny jest abstrakcyjny i jest stanem nadrzędnym dla .minor i .główne stany. Poniżej mój kod:
.state('dashboard', {
url: "/dashboard",
abstract: true,
templateUrl: "views/dashboard.html",
resolve: {
auth: function ($q, authenticationSvc) {
var userInfo = authenticationSvc.getUserInfo();
if (userInfo) {
return $q.when(userInfo);
} else {
return $q.reject({ authenticated: false });
}
}
},
controller: "DashboardCtrl",
data: { pageTitle: 'Example view' }
})
.state('dashboard.main', {
url: "",
templateUrl: "views/main.html",
controller: "DashboardCtrl",
data: { pageTitle: 'Main view' }
})
Jak widzisz w dashboard state mam opcję resolve. W ten sposób chciałbym przekierować użytkownika do strony logowania, jeśli nie jest on autoryzowany. Z tego powodu korzystam ze specjalnej usługi uwierzytelniania :
.factory("authenticationSvc", ["$http", "$q", "$window", function ($http, $q, $window) {
var userInfo;
function login(email, password) {
var deferred = $q.defer();
$http.post("/api/login", { email: email, password: password })
.then(function (result) {
if(result.data.error == 0) {
userInfo = {
accessToken: result.data.accessToken
};
$window.sessionStorage["userInfo"] = JSON.stringify(userInfo);
deferred.resolve(userInfo);
}
else {
deferred.reject(error);
}
}, function (error) {
deferred.reject(error);
});
return deferred.promise;
}
function getUserInfo() {
return userInfo;
}
return {
login: login,
logout: logout,
getUserInfo: getUserInfo
};
}]);
Sprawdzam wartość auth w config :
.run(function($rootScope, $location, $state) {
$rootScope.$state = $state;
$rootScope.$on("routeChangeSuccess", function(userInfo) {
consol.log(userInfo);
});
$rootScope.$on("routeChangeError", function(event, current, previous, eventObj) {
if(eventObj.authenticated === false) {
$state.go('login');
}
});
});
Ale niestety, gdy idę do katalogu głównego lub stanu Pulpitu nawigacyjnego, dostaję pustą stronę. Co jest nie tak z tym kodem? Dzięki!
3 answers
Chodzi o to, aby nie przekierowywać, jeśli nie jest to potrzebne = = = jeśli już Przekierowano do zamierzonego stanu. Istnieje działający plunker z podobnym rozwiązaniem
.run(function($rootScope, $location, $state, authenticationSvc) {
$rootScope.$on( '$stateChangeStart', function(e, toState , toParams
, fromState, fromParams) {
var isLogin = toState.name === "login";
if(isLogin){
return; // no need to redirect
}
// now, redirect only not authenticated
var userInfo = authenticationSvc.getUserInfo();
if(userInfo.authenticated === false) {
e.preventDefault(); // stop current execution
$state.go('login'); // go to login
}
});
});
Sprawdź je dla podobnych wyjaśnień:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:28
Ponieważ używasz modułu UI-Router, powinieneś używać $stateChangeStart
, $stateChangeSuccess
wydarzenia.
Sprawdź ten link, aby uzyskać więcej: https://github.com/angular-ui/ui-router/issues/17
Jest też literówka w consol.log(userInfo)
w konsoli.
Sprawdź konsolę w chrome-dev-tools. To da pojęcie, czy czegoś jeszcze brakuje.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-30 13:30:45
Uważaj, że w rzeczywistości $stateChangeSuccess
event jest przestarzały i nie jest już dostępny w angular-ui-route
pakiecie. Tym zachowaniem zajmuje się transition hooks
. Możesz osiągnąć swój cel za pomocą $transitions.onStart
Jak Następuje:
run.$inject = ['$transitions', 'authenticationSvc'];
function run($transitions, authenticationSvc) {
$transitions.onStart({}, function (trans) {
var userInfo = authenticationSvc.getUserInfo();
var $state = trans.router.stateService;
if(userInfo.authenticated === false) {
$state.go('login'); // go to login
}
});
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-09 01:29:27