问题描述
我不确定这是否是实现这一点的最佳方式.如果您有其他意见,请分享.
I'm not sure if this is the best way to implement this. If you have other opinions please share.
我必须实现一个多收件箱系统,用户可以将多封电子邮件按不同的收件箱分组.
I have to implement a multi inbox system where the user can have multiple emails grouped by different inboxes.
例如:http://localhost/inbox/personal/
将显示 personal
收件箱中的电子邮件列表,http://localhost/inbox/business/3
将在 business
收件箱中显示电子邮件列表,并突出显示带有 id 的电子邮件:3
For example: http://localhost/inbox/personal/
will show a list of emails in personal
inbox, http://localhost/inbox/business/3
will show a list of emails in business
inbox and will highlight email with id: 3
路线如下所示:
const routes: Routes = [
{
path: '',
pathMatch: 'full',
redirectTo: 'personal' // redirect to personal inbox
},
{
path: ':inbox',
component: InboxContentComponent, // list of emails in :inbox
children: [
{
path: '',
component: InboxNoSelectedEmailComponent, // no email selected
},
{
path: ':id',
component: InboxSelectedEmailComponent, // show selected email content
}
]
}
];
我的问题是 InboxContentComponent
.我需要检测收件箱何时发生变化以及是否选择了电子邮件
My problem is with InboxContentComponent
. I need to detect when inbox changes and if an email is selected or not
constructor(private route: ActivatedRoute) {
}
ngOnInit() {
this.route.paramMap.subscribe(inbox => {
console.log('inbox', inbox);
});
}
事件仅在收件箱更改而不是电子邮件更改时发出.有没有办法检测子路由参数何时发生变化?
Events are emitted only when inbox changes and not when email changes. Is there a way to detect when child route parameters changes?
这样做 this.route.firstChild.paramMap.subscribe();
仅当在组件初始化时路由有第一个子节点时才有效.如果路由是这样的 http://localhost/inbox/business/
那么 this.route.firstChild
是 null
Doing this this.route.firstChild.paramMap.subscribe();
only works if on component initialization the route has a first child. if the route is like this http://localhost/inbox/business/
then this.route.firstChild
is null
我认为的解决方案是定义这样的路由
On solution I could think is to define routes like this
{
path: ':inbox/:id',
component: InboxContentComponent
}
然后检查InboxContentComponent
是否设置了:id
有什么想法吗?
推荐答案
为了解决这类问题,我会监听路由器事件并检索我想要的东西.像这样:
To tackle this kind of problem, I would listen to router events and retrieve what I want. Something like this :
import { Router, ActivatedRoute, NavigationEnd } from '@angular/router';
import { filter, map, mergeMap, tap } from 'rxjs/operators';
// ...
constructor(
// ...
private activatedRoute: ActivatedRoute,
private router: Router
) {
this.router.events
.pipe(
filter((event) => event instanceof NavigationEnd),
map(() => this.activatedRoute),
map((route) => {
while (route.firstChild) route = route.firstChild;
return route;
}),
mergeMap((route) => route.paramMap),
tap(
paramMap => console.log('ParamMap', paramMap)
)
).subscribe(
(paramAsMap) => // Get the params (paramAsMap.params) and use them to highlight or everything that meet your need
)
}
您可以根据自己的需要进行调整.参数 ?突出显示:无突出显示.
You can adapt this to your need. Params ? Highlight : NoHighlight.
这篇关于ActivatedRoute 订阅第一个子参数观察者的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!