每当我在用户存储中提取登录令牌时,我都会尝试更改路由,因此用户会登录配置文件页面或登录页面。但由于某些原因,当我访问<Project>
<ItemGroup>
<PackageReference Include="CodeGeneration.Roslyn" Version="0.4.38-gfe7ce5be9d" />
</ItemGroup>
</Project>
或/
时,页面会以无限循环结束。我该如何解决?
controller.js
/login
的index.html
$scope.isActive = function(viewLocation) {
return viewLocation === $location.path();
};
vm.adsomaToken = localStorage.adsomaToken;
vm.adsomaUserId = localStorage.adsomaUserId;
vm.adsomaAccountType = localStorage.adsomaAccountType;
if(vm.adsomaToken && vm.adsomaUserId && vm.adsomaAccountType) {
$window.location.href = "/";
} else {
$window.location.href = "/login";
}
vm.logout = function() {
localStorage.clear();
$window.location.href = "/login";
};
答案 0 :(得分:1)
当您必须处理动态路由时,直接使用 $ window.location 并不是最佳选择。
我建议使用UI-Router。
使用UI-Router,您可以注册将在某些导航事件后触发的功能。
考虑注册当您尝试输入进入状态(或路线)时将执行的功能。
在此示例中,我定义了一个 LoginHook ,用于检查是否应将每个转换重定向到&#34; / login&#34; ,否则可以允许。
LoginHook.js
LoginHook.$inject = ['$transitions','$state'];
export function LoginHook ($transitions, $state) {
//
$transitions.onEnter({/*Matching every destination*/}, $transition => {
//
if($transition.to().name !== 'login') {
//
if( user.allowed ) { // Replace this with your auth check
//
return true; // Allowing access
} else {
//
redirectToLogin(); // Redirecting to "login"
}
} else {
// Avoiding auth checking if i'm going to "login"
return true;
}
})
//
function redirectToLogin() {
//
$state.go('login');
}
}
编辑回答
正如我在您的垃圾箱中看到的那样,您应该先处理当前导航,然后再将其替换为另一个。
试试这个:
resolve: {
data: function ($location, $window, $q) {
if(!localStorage.adsomaToken && !localStorage.adsomaUserId &&
!localStorage.adsomaAccountType) {
//
$q.reject('NOT ALLOWED');
$location.path('/login');
} else {
$q.resolve('ALLOWED');
}
}
}