问题场景是这样的,点击 tab 后会浏览器地址栏会切换到 tab 对应的 url
<a nz-tab-link [routerLink]="tab.route" [state]="{ tab }">{{tab.name}}</a>
在 NavigationStart route event 订阅处理函数中会将当前 tab 设置为 active,详见之前的博问 https://q.cnblogs.com/q/151591
async ngOnInit() {
this._router.events
.pipe(
filter(ev => ev instanceof NavigationStart),
debounceTime(100)
)
.subscribe((ev) => {
this.setActiveTab(ev.url)
});
}
如果当前 tab 对应的 url 发生 NavigationError 错误,RouteOutlet 无法加载对应的 component,依然还是 tab 切换前的 component 对应的内容。
开始尝试的解决方法是通过更新 Subject 的方式通知前任 tab 的 component 清除内容,比如通过下面的代码触发清空 sidebar 中的内容:
this.sideBarSvc.$sideBar.next(undefined!);
这样虽然管用,但会带来一个问题,当发生 NavigationError 错误后再点击前任 tab,不会触发前任 tab 的 component(在 RouteOutlet 中加载的)更新内容,所以还是空白,只有再点击另外一个非前任 tab,然后再点击前任 tab 才行。
后来想想干脆直接给 RouteOutlet 塞一个新的 component,如果可以,将是一个更简单有效的方法,但目前不知道怎么在代码中塞这个 component
似乎没有办法实现通过代码在运行时给 RouteOutlet 塞一个 Component
对于 NavigationError 错误后再点击前任 tab 的内容更新问题已经解决,详见 https://q.cnblogs.com/q/151601