angular - 在路由器出口注入的延迟加载模块中使用面包屑组件
问题描述
我正在构建 Angular 8 面包屑组件。应用程序要求它通常显示在页面的内容中(不仅),但它永远不会位于可能位于路由器插座之外的标题中。这就是问题出现的地方。我正在使用延迟加载的模块,将组件放置在延迟加载的组件模板中。
我想创建一个可观察的。首先使用过滤器映射到路由器根 firstChild。但我无法通过条件......这是我迄今为止尝试过的。
breadcrumbs$: Observable<Breadcrumb[]>;
constructor(router: Router, activatedRoute: ActivatedRoute) {
this.breadcrumbs$ = router.events.pipe(
filter(event => event instanceof NavigationEnd),
map(() => {
return this.buildBreadcrumbs(activatedRoute.root.firstChild);
})
);
}
buildBreadcrumbs(route: ActivatedRoute) {
// logic
}
仅当在路由器插座内呈现面包屑组件时才会出现此问题。如果我将它放在模板中的同一级别,那么它工作得很好。如果通过订阅 router.events 对 NavigationEnd 事件进行条件检查,则正常。有什么办法吗?
感谢您的建议!
编辑:我在这里附上了一些现实生活中的例子https://stackblitz.com/edit/breadcrumbs-mwsp
解决方案
仅当在路由器插座内呈现面包屑组件时才会出现此问题。如果我将它放在模板中的同一级别,那么它工作得很好。
当路由改变时组件被销毁,因为它在内部<router-outlet>
成为路由内容的一部分。当路由改变时,组件被销毁并且永远不会收到NavigationEnd
. 当组件在外面时,它的寿命会更长,并且会接收到事件。
你可以通过给你的 observable 一个起始值来轻松解决这个问题。
this.breadcrumbs$ = this.router.events.pipe(
filter(event => event instanceof NavigationEnd),
startWith(undefined),
map(() => {
return this.buildBreadcrumbs(this.activatedRoute.root.firstChild);
})
);
推荐阅读
- python - 如何在 Arduino IDE 中向 http 请求添加标头
- javascript - 为什么我的表格过滤器正在删除表格标题?
- hash - 映射键值对时,哈希如何防止冲突?
- php - 当预期相同的行为时,为什么通过 `auth guard A` 重定向的登录与来自 `auth guard B` 的登录不同?
- java - 像 android.telephony/telecom 这样的私有类包
- python - 使用 numpy 的像素或两个图像
- datetimepicker - DateTimePicker react-widgets 中缺少 TimePicker 图标
- laravel - Laravel Faker 数据在拆解或测试结束时会发生什么
- javascript - 将选定的选项从 HTML 转换为 JavaScript,并使用 If 语句创建数字变量
- python - 使用 tkinter 从 python 中的 MS SQL 服务器数据库插入树视图行