Angular+ngrx:必须从其他地方取消异步canActive Guard
正如标题所说:有没有办法告诉路由器取消当前的导航 情况如下: 一个路线守卫发出一个动作。 效果基于该操作执行异步调用。 完成后,异步调用将对属性分派存储更新操作。 卫兵订阅了该属性的选择器,比如属性$ 一旦属性$更新,警卫决定是否允许导航。 这种方法仅在效果的异步操作请求的资源正确返回HTTP 200时才有效。但如果操作失败,比如HTTP 404,那么问题就出在这里: 警卫既不会批准也不会拒绝导航。它处于挂起状态,在警卫返回true或false之前,不会发生其他导航请求。Angular+ngrx:必须从其他地方取消异步canActive Guard,angular,ngrx,angular-router,ngrx-effects,angular-guards,Angular,Ngrx,Angular Router,Ngrx Effects,Angular Guards,正如标题所说:有没有办法告诉路由器取消当前的导航 情况如下: 一个路线守卫发出一个动作。 效果基于该操作执行异步调用。 完成后,异步调用将对属性分派存储更新操作。 卫兵订阅了该属性的选择器,比如属性$ 一旦属性$更新,警卫决定是否允许导航。 这种方法仅在效果的异步操作请求的资源正确返回HTTP 200时才有效。但如果操作失败,比如HTTP 404,那么问题就出在这里: 警卫既不会批准也不会拒绝导航。它处于挂起状态,在警卫返回true或false之前,不会发生其他导航请求。 有没有一种方法可以实现
有没有一种方法可以实现这样的调用,简单地说就是:this.\u router.cancelAllNavigationRequests?您没有提供任何代码,因为您的案例应该在不需要cancelAllNavigationRequests的情况下工作,您只是没有正确处理HTTP错误。下面是我在一个守卫中使用的一种方法,它可能会帮助你或给你一些想法,它类似于ngex示例中的方法: 在呼叫该服务之前,该警卫将检查是否已经存在机密文件,而不是部分文件
@Injectable()
export class ClassifiedGuardService implements CanActivate, CanActivateChild {
constructor(private store: Store<fromRoot.State>, private classifiedService: ClassifiedService, private router: Router) {
}
vendorClassifiedAlreadyLoaded(id: string): Observable<boolean> {
return this.store.pipe(
select(fromContext.selectAllClassifieds),
map(entities => {
for (let i = 0; i < entities.length; i++) {
if (entities[i].id === id && !entities[i].partial) {
return true;
}
}
return false;
}),
take(1)
);
}
getVendorClassifiedFromServer(id: string) {
return this.classifiedService.getVendorsClassified({id: id}).pipe(
map(payload => new ClassifiedAction.GetVendorsClassifiedSuccess(payload)),
tap((action: ClassifiedAction.GetVendorsClassifiedSuccess) => this.store.dispatch(action)),
map(payload => !!payload),
catchError(err => {
this.store.dispatch(new ClassifiedAction.GetVendorsClassifiedFail(err));
this.router.navigate(['/errors/bad-request']);
return of(false);
})
);
}
getFullClassified(id: string): Observable<boolean> {
return this.vendorClassifiedAlreadyLoaded(id).pipe(
switchMap(inStore => {
if (inStore) {
return of(inStore);
}
return this.getVendorClassifiedFromServer(id);
})
);
}
canActivate(route: ActivatedRouteSnapshot): Observable<boolean> {
return this.getFullClassified(route.params['id']);
}
canActivateChild(route: ActivatedRouteSnapshot) {
return this.canActivate(route);
}
}
嘿,当HTTP调用的响应不是200时,你不能将你的防护更改为重定向到默认的“错误页”吗?你可以指示状态失败,或者让防护侦听效果将发出的操作。嗨,谢谢你的评论,但你的代码不是基于redux的。这里的复杂性在于,警卫无法访问或看到sotre的效果以及由此产生的行动调度。