Angular 21 中如何为 RouterLink 添加默认 queryParams?
结论
设置 Router 的 defaultQueryParamsHandling: 'merge' 后,没有单独设置 queryParamsHandling 的 RouterLink 会合并当前 URL 中的查询参数。通常无需继承 RouterLink 或重写 urlTree。
在题目所述的多租户场景中,如果当前地址带有 myCustId,导航到其他链接时,该参数会与其他现有查询参数一并保留。Angular 文档说明,当 Router.createUrlTree 未指定查询参数处理方式时,会采用此默认策略;RouterLink 内部也会调用 Router.createUrlTree。RouterConfigOptions
配置方式
使用独立应用配置时,可以这样设置:
import { provideRouter, withRouterConfig } from '@angular/router';
bootstrapApplication(AppComponent, {
providers: [
provideRouter(
routes,
withRouterConfig({
defaultQueryParamsHandling: 'merge',
}),
),
],
});
如果项目使用 RouterModule.forRoot,可以在路由配置中设置同一选项:
RouterModule.forRoot(routes, {
defaultQueryParamsHandling: 'merge',
});
配置后,普通链接不必逐个声明:
<a [routerLink]="['/dashboard']">Dashboard</a>
merge 会把当前 URL 的查询参数与链接显式提供的 queryParams 合并。同名参数以链接提供的值为准。链接若显式设置了 queryParamsHandling,则按该链接的设置处理。具体行为见 Angular 的路由配置指南。
与原实现的差异
题目中的代码只从当前路由取出 myCustId,再将它写入 UrlTree。全局设置 merge 则会保留当前 URL 中的所有查询参数。如果应用还使用临时筛选条件或分页参数,这些参数也可能随导航保留。
如果只需要传递 myCustId,全局设置 merge 可能不合适。可以在需要的链接上显式准备只包含该参数的 queryParams,并设置 queryParamsHandling: 'merge';也可以实现组合式包装指令,在创建链接时合并当前的 myCustId 和链接自己的参数。不要依赖 _urlTree 这类 @internal 成员,因为它不是稳定的公开扩展接口。
注意事项
defaultQueryParamsHandling 只设定默认处理策略,不会自动创建值为 myCustId 的参数。它保留当前 URL 中已有的查询参数;如果入口 URL 没有 myCustId,该配置不会补上它。Angular 文档还指出,未设置默认策略或单链接策略时,查询参数默认采用替换行为。RouterConfigOptions
备注:内容仅供参考。
