我们有一个User
组件接收用户对象作为@input
:
export class UserComponent implements OnInit {
@Input() user: User;
constructor() {}
}
这里对应的模板:
<div class="user-box">
<img class="avatar" [src]="user.avatar" alt="user_picture">
<div class="infos">
<div class="username">{{ user.username }}</div>
<div>{{ user.email }}</div>
<div class="gender">{{ user.gender }}</div>
</div>
</div>
在路由组件UsersList
(primary <router-outlet>
)中,我们需要在屏幕上显示用户列表:
<user
*ngFor="let user of users
[user]="user"
(click)="selectUser(user)">
</user>
然后,当我们单击从列表中选择一个用户时,我们使用相同的User
组件显示选定的用户数据,但这次是一个路由组件(名为<router-outlet name="selected">
):
这里我们的路线:
const ROUTES: Routes = [
{
path: '',
component: UsersList
},
{
path: ':username',
component: UserComponent,
outlet: 'selected'
}
];
所以,这里的selectUser()
功能:
selectUser(user: User) {
return this.router.navigate([ { outlets: { selected: [ user.username ] } } ], { state: { user } });
}
在我们的User
组件内部,我们需要实现OnInit
接口:
if (this.route.outlet === 'selected') {
this.route.paramMap.pipe(map(() => window.history.state)).subscribe(state => {
if (!state.user) {
return this.router.navigate([ { outlets: { selected: null } } ]);
}
this.user = state.user;
});
}
所有这一切都很好!我想知道的是,这样做是否是一个好习惯?
仅供参考,我也尝试使用路由解析器,但我无法访问该NavigationExtras
state
对象...在解析器中获取用户数据的唯一方法是将其传递为queryParams
. 当我们有 3 个属性时会很好,但是,如果我们有 10 多个属性,URL 就会变得丑陋和混乱。而且,解析器的角色似乎是解析异步数据而不是传递静态数据。
感谢您提供见解!