Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 角度2可以激活导航_Angular_Angular2 Routing - Fatal编程技术网

Angular 角度2可以激活导航

Angular 角度2可以激活导航,angular,angular2-routing,Angular,Angular2 Routing,我有以下问题。我已经做了一个CanActivate守卫,如果您登录,您可以“转到”债务组件。我的问题是当我登录时,我想将用户重定向到Debts组件(因为RegistrationComponent是默认的),但它不工作(实际上我的页面被阻塞了..我什么都做不了)。我的激活功能 export class AuthGuardService implements CanActivate { constructor(private router: Router) { } canActivate():

我有以下问题。我已经做了一个CanActivate守卫,如果您登录,您可以“转到”债务组件。我的问题是当我登录时,我想将用户重定向到Debts组件(因为RegistrationComponent是默认的),但它不工作(实际上我的页面被阻塞了..我什么都做不了)。我的激活功能

export class AuthGuardService implements CanActivate {

constructor(private router: Router) { }

canActivate(): Promise<boolean>{
    return checkIfAuth().then(() => {
        setLoggedIn(true);
        this.router.navigate(['/debts']); // <- broken :(
        return true;
    }).catch(() => {
        setLoggedIn(false);
        this.router.navigate(['/login']); // <- broken :(
        return false;
    })
  }
}


export function checkIfAuth () {
return new Promise((resolve, reject) => {
    firebase.auth().onAuthStateChanged((user) => {
        if(user){
            return resolve(true);
        }
        else{
            return reject(false);
        }
    })
  })
}

我所做的是一种黑客行为,但它的工作完美无瑕:

首先,我在我的
logincomponent
路径上设置了
Guard

{ path: 'login', component: LoginComponent, canActivate: [AuthGuard] }
然后我使用
RouterStateSnapshot
获取URL状态的单个实例,指示用户试图访问的内容

然后,我可以在警卫室管理案件:

从'@angular/Router'导入{CanActivate,Router,ActivatedRouteSnapshot,routerstatesapshot};
...
/**
*通过身份验证保护要到达的路由
*/
canActivate(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):布尔值{
//根据令牌的存在设置用户身份验证状态
this.authService.setLoggedInState();
//检查用户身份验证状态
if(this.authService.isAuthenticated){
//当用户已通过身份验证时显式导航到“/login”
如果(state.url=='/login'){
this.router.navigate(['/dashboard']);//您的债务
}
返回true;
}否则{
//允许路由到“./login”以获得身份验证
如果(state.url=='/login'){
返回true;
}
//未经身份验证时指向任何URL的显式导航
this.router.navigate(['/login']);
返回false;
}
}
有关快照的文档链接:

要使其在您的案例中发挥作用,您只需将
setLoggedInState()
适应您的案例,您似乎已经具备了这种能力


N.B:我将此解决方案称为黑客,因为您实际上在
登录
上设置了一个防护,而即使用户未经身份验证,它仍然允许用户访问它。尽管如此,它仍然很有效。

在你的帖子中有一些我不明白的地方。确切的问题是什么?如果用户已登录,是否希望用户转到
DebtsComponent
?如何访问登录组件?我从菜单:)访问登录组件时,它看起来像(债务帐户单出)而不是(注册登录)。我的问题是:我想将用户总是(当他登录时)重定向到DebtsComponent(当他想访问登录/注册组件时),并将用户总是(当他未登录时)重定向到LoginComponent(当他想访问Debts/帐户组件时)。登录时,我们可能需要代码,但是我的提示是,在
登录
时,您应该尝试导航到您的债务组件,并且在您的guard中,如果用户是loggedIn(而不是在您的guard中导航),则只返回
true
。是的,是的,我这样做了,它工作正常(这不是问题:D)。看,在您登录后,您被重定向到localhost/deborts,这没问题,但是用户可以自己更改URL(localhost/login),我想在他登录时重定向他(因为您已经登录时无法登录:P)。你知道我在说什么吗(哦,好吧。我现在明白了。非常感谢:)实际上,我不得不“更改”一点这段代码,但效果非常好!谢谢:)没问题!很高兴我能帮上忙:)@AlexBeugnet不过我不会称之为黑客,对我来说一切都是合法的。你的警卫如何行动完全取决于你。一般来说,基于
ActivatedRouteSnapshot
的警卫决策还允许您为不同的路由回收单个警卫,而不是为不同的路由创建多个单独的警卫。
{ path: 'login', component: LoginComponent, canActivate: [AuthGuard] }