清理Angular Router解决数据的事件?

时间:2018-01-15 15:49:38

标签: angular angular-router

如何/何时/何时可以清理Angular路由器提供的已解决的项目(例如可观察的数据)?

Angular的Router resolve数据提供给组件,但我没有看到可用的对称unresolve调用。 Router知道何时完成已解析的数据(在内部,advanceRoute是此的一个方面)。但是,它不以解析器可以看到的方式通告此类事件,因为解析器接收不可变快照而不是任何事件流。

这是我目前的(不完整)策略:

resolve(route: ActivatedRouteSnapshot, router: RouterStateSnapshot) {
    let vm = RouteValue.useActiveProvider<ViewModelFactoryBase>(route).value(this, (k) => route.paramMap.get(k));
    this.uponLeaving(route, () => vm.disconnect());
    return vm.connect();
}

private uponLeaving(route: ActivatedRouteSnapshot, action: () => void) {
    let url = [""].concat(...route.pathFromRoot
        .filter(r => r.url instanceof Array)
        .map(r => r.url.map(s => s.path)))
        .join('/');
    this.router.events
        .filter(e => (
            e instanceof NavigationEnd ||
            e instanceof NavigationCancel ||
            e instanceof NavigationError
        ) && !(this.router.isActive(url, false)))
        .first()
        .subscribe(action);
}

您可能会注意到以下问题:

  1. 它不考虑查询参数或辅助路由,因为ActivatedRouteSnapshot很难转换为有用的内容(例如Router.isActive需要UrlTree)。
  2. 它通过一个弦弱耦合到角度的路线解析器。更新快照,可能会或可能不会重复使用先前解析的数据。
  3. 它不使用angular的有效URL策略(可配置且可能更改)。 note RouterStateSnapshot.url表示最终目的地,而不是当前节点。
  4. 它也有其他问题。最理想的是绑定到ActivatedRoute.data Observable的nextcomplete事件,但这不可能来自resolveRouteLeave事件或类似事件也可能起作用,但目前似乎没有为此需求做出任何限制。

    我考虑过切换到一种切换式策略 - 我的视图模型被解析为Shared可观察对象,而不是Published - 然后监视ActivationEnd(或相同的导航完成)上面代码中的事件)在已解析的视图模型上释放解析器的引用计数。现在,清理工作更深层次。这消除了我更喜欢的简单连接管理对称性,并且在Component级别也变得相当复杂,其中组件现在必须更加努力地理解路由器,这可能不应该是他们关心的。

0 个答案:

没有答案