【发布时间】:2018-04-30 18:35:36
【问题描述】:
我正在寻找一种方法来终止异步路由解析。
该场景是用户单击一个链接,该链接获取组件所需的数据,并且在解决该问题时用户回击或单击另一个链接。然后我想取消当前的解析并开始新的路由。
我无法通过侦听这些更改来拦截路由,因为在处理现有路由(仍处于解析阶段)时不会触发任何路由事件订阅。
例如,我的路由器可能如下所示:
const appRoutes: Routes = [
{
path: 'resolvableRoute',
component: ResolvableRouteComponent,
resolve: {
data: RouteResolver
}
}];
以及解析器:
@Injectable()
export class RouteResolver implements Resolve<any> {
constructor(private http: HttpClient) {}
public resolve(router: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any> {
return this.http.get('api/path/for/data');
}
}
在 http 调用以任何方式返回之前,路由器或多或少都卡住了。
我有一个很好的加载器,它在路由转换时启动,我不想在获得该组件所需的数据之前显示新组件,但我需要能够终止请求。
例如,如果我没有使用解析器,则用户可以在该组件获取数据时(例如在初始化时)离开该组件,因为我可以破坏该组件并终止 http 请求。以这种方式制作组件的缺点是我在处理获取数据时要么必须显示空白页面,要么显示不完整的页面。
【问题讨论】:
-
你试过canDeactivate 路由的属性了吗?它可以用来终止请求。
-
CanDeactivate 仅在路由激活时有效。我需要在路由状态仍在触发时终止请求。基本上在 ResolveStart 和 ResolveEnd 之间。
-
这个答案可能有用..stackoverflow.com/questions/36490926/…