如何/何时/何时可以清理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);
}
您可能会注意到以下问题:
ActivatedRouteSnapshot
很难转换为有用的内容(例如Router.isActive
需要UrlTree
)。RouterStateSnapshot.url
表示最终目的地,而不是当前节点。它也有其他问题。最理想的是绑定到ActivatedRoute.data
Observable的next
和complete
事件,但这不可能来自resolve
。 RouteLeave
事件或类似事件也可能起作用,但目前似乎没有为此需求做出任何限制。
我考虑过切换到一种切换式策略 - 我的视图模型被解析为Shared
可观察对象,而不是Published
- 然后监视ActivationEnd
(或相同的导航完成)上面代码中的事件)在已解析的视图模型上释放解析器的引用计数。现在,清理工作更深层次。这消除了我更喜欢的简单连接管理对称性,并且在Component
级别也变得相当复杂,其中组件现在必须更加努力地理解路由器,这可能不应该是他们关心的。