gpt4 book ai didi

javascript - 为什么在使用@angular/redux-store 中的@select 时,Angular 守卫的行为会有所不同

转载 作者:数据小太阳 更新时间:2023-10-29 04:21:41 25 4
gpt4 key购买 nike

  • 我有一个使用两个守卫的 Angular 设置。 canLoadcanActivate
  • 两者都通过 @select 从@angular-redux/store 获取相同的可观察值

问题:为什么 canActivate@select 返回的可观察对象一起工作,而 canLoad 会中断所有路由然后呢?这两个守卫有什么区别?

相关 Angular 问题:https://github.com/angular/angular/issues/18991

auth.guard.ts

@Injectable()
export class AuthGuard implements CanLoad, CanActivate {

@select() readonly authenticated$: Observable<boolean>; // @angular-redux/store

canLoad(): Observable<boolean> | boolean {
// return true; // works
return this.authenticated$; // ERROR: all routing stops from and to the current page
}

canActivate(): Observable<boolean> | boolean {
// return true; // works
return this.authenticated$; // works
}

}

app-routing.module

const routes: Routes = [
{
path: '',
component: SomeAComponent,
pathMatch: 'full'
},
{
path: 'someb',
component: SomeBComponent,
canActivate: [
AuthGuard
],
},
{
path: 'lazy',
loadChildren: './lazy/lazy.module#LazyModule',
canLoad: [
AuthGuard
]
},
{
path: '**',
redirectTo: '/'
}
];

最佳答案

我遇到了同样的问题,所以要解决它并在 CanLoad 和 CanActivate 中工作,您应该添加 operator take(1)

@Injectable()
export class AuthGuard implements CanLoad, CanActivate {

@select() readonly authenticated$: Observable<boolean>; // @angular-redux/store

canLoad(): Observable<boolean> | boolean {
// return true; // works
return this.authenticated$.pipe(take(1));
}

canActivate(): Observable<boolean> | boolean {
// return true; // works
return this.authenticated$;
}

}

关于javascript - 为什么在使用@angular/redux-store 中的@select 时,Angular 守卫的行为会有所不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46040890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com