尝试更改路径时页面处于无限循环中

时间:2018-05-07 09:52:13

标签: angularjs

每当我在用户存储中提取登录令牌时,我都会尝试更改路由,因此用户会登录配置文件页面或登录页面。但由于某些原因,当我访问<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";
};

1 个答案:

答案 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');
        }
    }
}