1

我想创建一个复杂的路由器保护来检查用户是否在 Web 应用程序中进行了身份验证,但如果是这样,它还会检查其他条件,并且对于每个真实条件,它都会重定向到一个页面(但是在同一个路由器保护下)。为了更好地在路由器保护内部解释这一点,我必须做这样的事情:

canActivate(state: RouterStateSnapshot) {
   if(isAuthenticated()) {
     if(!isEmailVerified) {
        // redirect to the "check the email" page
     }
     else if(!isProfileComplete()) {
        // redirect to profile completion page
     }
     else {
        // redirect to user homepage
     }
    return true;
   } else {
   // redirect login
   return false;
   }
}

问题实际上是这不起作用,因为每个重定向都会带到受此保护保护的页面,然后每个重定向都会调用另一个重定向,并以无限循环结束。如果 state.url 与我们重定向到条件主体内部的不同,我已经尝试检查条件内部,但这不起作用。有没有一个简单的解决方案来做到这一点?

4

2 回答 2

1

我建议为每个条件使用重定向字符串,并在函数末尾重定向守卫,例如;

canActivate(state: RouterStateSnapshot) {
   let redirectionPath: string = "";
   if(isAuthenticated()) 
   {
        if(!isEmailVerified) {
           redirectionPath = "emailverified";
        }
        else if(!isProfileComplete()) {
        // redirect to profile completion page
           redirectionPath = "completionPage";
        }
        else {
          // redirect to user homepage
           redirectionPath = "homepage";
        }
   } else {
           redirectionPath = "login";
   }

   this.router.navigate(['/your-path']);
   return true;
} 
于 2019-02-01T11:20:40.397 回答
0

if(!isEmailVerified) {
        // redirect to the "check the email" page
     }
     else if(!isProfileComplete()) {
        // redirect to profile completion page
     }
     else {
        // redirect to user homepage
     }

从守卫中删除此代码并将其添加到另一个守卫(重定向守卫)中,您可以在其中使用条件重定向页面

于 2019-02-01T11:14:16.860 回答