是否可以在Angular 2路线中有一个可选的路线参数?我在RouteConfig中尝试了Angular 1.x语法但收到了以下错误:
"ORIGINAL EXCEPTION:Path"/ user /:id?"包含"?",这在路由配置中是不允许的."
@RouteConfig([ { path: '/user/:id?', component: User, as: 'User' }])
小智.. 251
您可以使用和不使用参数定义多个路由:
@RouteConfig([ { path: '/user/:id', component: User, name: 'User' }, { path: '/user', component: User, name: 'Usernew' } ])
并处理组件中的可选参数:
constructor(params: RouteParams) { var paramId = params.get("id"); if (paramId) { ... } }
另请参阅相关的github问题:https://github.com/angular/angular/issues/3525
您可以使用和不使用参数定义多个路由:
@RouteConfig([ { path: '/user/:id', component: User, name: 'User' }, { path: '/user', component: User, name: 'Usernew' } ])
并处理组件中的可选参数:
constructor(params: RouteParams) { var paramId = params.get("id"); if (paramId) { ... } }
另请参阅相关的github问题:https://github.com/angular/angular/issues/3525
{path: 'users', redirectTo: 'users/'}, {path: 'users/:userId', component: UserComponent}
这样,添加参数时不会重新呈现组件.
当信息是可选的时,建议使用查询参数.
路由参数或查询参数?
没有严格的规则.一般来说,
更喜欢路线参数
该值是必需的.
该值是区分一条路径与另一条路径的必要条件.
更喜欢查询参数
该值是可选的.
值是复杂的和/或多变量的.
来自https://angular.io/guide/router#optional-route-parameters
您只需要从路径路径中取出参数.
@RouteConfig([ { path: '/user/', component: User, as: 'User' }])
Angular 4 - 解决可选参数排序的解决方案:
做这个:
const appRoutes: Routes = [ {path: '', component: HomeComponent}, {path: 'products', component: ProductsComponent}, {path: 'products/:id', component: ProductsComponent} ]
请注意,products
和products/:id
路由的名称完全相同.products
对于没有参数的路径,Angular 4将正确跟随,如果参数将遵循products/:id
.
然而,对于非参数路由路径products
必须不能有斜线,否则角度将错误地把它当作一个参数路径.所以在我的情况下,我有产品的尾部斜线,它没有工作.
不要这样做:
... {path: 'products/', component: ProductsComponent}, {path: 'products/:id', component: ProductsComponent}, ...
rerezz的答案非常好,但它有一个严重的缺陷.它导致User
组件重新运行该ngOnInit
方法.
当你在那里做一些沉重的东西并且当你从非参数路径切换到参数路径时不希望它重新运行时,它可能会有问题.虽然这两条路线都是为了模仿一个可选的url参数,但不是两条不同的路由.
以下是我建议解决问题的方法:
const routes = [ { path: '/user', component: User, children: [ { path: ':id', component: UserWithParam, name: 'Usernew' } ] } ];
然后,您可以将负责处理param的逻辑移动到UserWithParam
组件,并将基本逻辑保留在User
组件中.User::ngOnInit
当您从/ user导航到/ user/123时,无论您执行什么操作都不会再次运行.
别忘了把它
放在User
模板中.