我正在編寫攔截器重定向到登錄頁面,如果用戶尚未登錄。我正在使用$位置來更改瀏覽器地址。
代碼工作,但是,「有時」,如果鍵入一個URL這是爲登錄用戶(例如:http://localhost:4662/#/index/companies),瀏覽器加載「企業」模板,並更改URL地址到登錄頁面:(http://localhost:4662/#/)。所以我必須點擊Enter才能真正重定向到登錄頁面。它有時會發生(有時也意味着我可以多次做,我得到的行爲預期,但突然就沒有盡本分)
這是我的代碼:
$httpProvider.interceptors.push(function ($q, $rootScope, $location, $injector) {
return {
request: function (config) {
//the same config/modified config/a new config needs to be returned.
var applicationService = $injector.get('applicationService');
var loggedIn = applicationService.isLoggedIn();
if (!loggedIn) {
$location.path('/');
//$window.location.href = "#";
} else if ($location.path() == '/') {
$location.path('/index');
}
return config;
},
requestError: function (rejection) {......
而不是使用攔截我試了實施路線改變聽者如下,但我得到了一模一樣的問題:
app.run(function($rootScope, $state, $location, applicationService){
$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams){
var loggedIn = applicationService.isLoggedIn();
if (!loggedIn) {
$location.path('/');
} else if (toState.name == 'home') {
$location.path('/index');
}
});
});
我在做什麼錯?我想知道$ location是不是正確的選擇。
$ state.go了另一枚$ stateChangeStart事件,它在一個無限循環結束 –
看看這個答案:http://stackoverflow.com/questions/20094273/stop-angular-ui-路由器導航,直到-承諾,是分辨/ 28827077#288 27077雖然我建議閱讀整個問題和所有答案。 – iH8
謝謝,我發現event.preventDefault()避免了無限循環,並與$ state.go結合產生了預期的行爲。 –