2015-12-10 36 views
69

Có thể có tham số tuyến tùy chọn trong tuyến đường Angular 2 không? Tôi đã thử các cú pháp 1.x góc trong RouteConfig nhưng nhận được bên dưới lỗi:Góc 2 tham số tuyến tùy chọn

"ORIGINAL EXCEPTION: Path "/user/:id?" contains "?" which is not allowed in a route config."

@RouteConfig([ 
{ 
    path: '/user/:id?', 
    component: User, 
    as: 'User' 
}]) 

Trả lời

117

Bạn có thể xác định nhiều tuyến đường có và không có tham số:

@RouteConfig([ 
    { path: '/user/:id', component: User, name: 'User' }, 
    { path: '/user', component: User, name: 'Usernew' } 
]) 

và xử lý các tham số tùy chọn trong thành phần của bạn :

constructor(params: RouteParams) { 
    var paramId = params.get("id"); 

    if (paramId) { 
     ... 
    } 
} 

Xem thêm vấn đề liên quan đến github: https://github.com/angular/angular/issues/3525

+7

Sửa lỗi nếu tôi sai, nhưng giải pháp này chỉ hoạt động khi thứ tự các tuyến trong mảng bị đảo ngược, tức là tuyến đường có tham số xảy ra trước khi tuyến kia xảy ra. Cho đến khi tôi làm điều đó, router chỉ khớp với tuyến mà không có tham số. –

+0

@Aviad P Thứ tự không quan trọng đối với tôi khi tôi gọi là 'router.navigate (['/user ', {id: 2}]); ', nhưng nó _did_ là vấn đề khi tôi gọi' router.navigate (['/user ', 2]); '. Trong trường hợp thứ hai, tuyến đường có tham số ID cần được xác định trước tuyến đường mà không có bất kỳ tham số nào. – reduckted

+6

giải pháp này vẫn áp dụng? Tôi nhận thấy việc chuyển từ "Người dùng" sang "Người dùng mới" sẽ tái khởi tạo thành phần 'Người dùng' – teleaziz

22

Bạn nên sử dụng tham số truy vấn khi thông tin là tùy chọn.

Route Parameters or Query Parameters?

There is no hard-and-fast rule. In general,

prefer a route parameter when

  • the value is required.
  • the value is necessary to distinguish one route path from another.

prefer a query parameter when

  • the value is optional.
  • the value is complex and/or multi-variate.

từ https://angular.io/docs/ts/latest/guide/router.html#!#query-parameters

Bạn chỉ cần đưa ra các tham số từ con đường tuyến đường.

@RouteConfig([ 
{ 
    path: '/user/', 
    component: User, 
    as: 'User' 
}]) 
+4

Thay đổi thông số tuyến tùy chọn thành phần hiển thị lại, nhưng việc thay đổi queryParams thì không. Ngoài ra nếu bạn giải quyết một số dữ liệu trước khi điều hướng tuyến đường, nó sẽ được yêu cầu mỗi khi bạn thay đổi params tuyến tùy chọn. – neilhem

2

Với angular4 chúng ta chỉ cần tổ chức các tuyến với nhau trong hệ thống phân cấp

const appRoutes: Routes = [ 
    { path: '', component: MainPageComponent }, 
    { path: 'car/details', component: CarDetailsComponent }, 
    { 
    path: 'car/details/platforms-products', 
    component: CarProductsComponent 
    }, 
    { path: 'car/details/:id', component: CadDetailsComponent }, 
    { 
    path: 'car/details/:id/platforms-products', 
    component: CarProductsComponent 
    } 
]; 

này làm việc cho tôi. Cách này router biết tuyến đường tiếp theo dựa trên các tham số id tùy chọn là gì.

4

góc 4 - Giải pháp để giải quyết các Trật tự của các tham số tùy chọn:

DO NÀY:

const appRoutes: Routes = [ 
    {path: '', component: HomeComponent}, 
    {path: 'products', component: ProductsComponent}, 
    {path: 'products/:id', component: ProductsComponent} 
] 

Lưu ý rằng productsproducts/:id tuyến đường được đặt tên giống hệt nhau. Angular 4 sẽ theo dõi một cách chính xác products cho các tuyến đường không có tham số và nếu có thông số, nó sẽ theo sau products/:id.

Tuy nhiên, đường dẫn cho tuyến đường không thông số products phải không có dấu gạch chéo, nếu không góc sẽ xử lý không chính xác nó như một đường dẫn tham số. Vì vậy, trong trường hợp của tôi, tôi đã có dấu gạch chéo cho các sản phẩm và nó không hoạt động.

XIN ĐỪNG LÀM THẾ:

... 
{path: 'products/', component: ProductsComponent}, 
{path: 'products/:id', component: ProductsComponent}, 
... 
+0

Nếu cả hai đều đi đến ProductComponent, làm cách nào bạn xử lý thông số tùy chọn ở đó? – Arwin

+0

Bạn có thể truy cập các thông số: id1,: id2, etc cũng như url được yêu cầu trong ProductComponent như sau: this.route.url.first() .mergeMap ((url) => { // console.log ('1: thay đổi url được phát hiện' + url); trả lại this.route.params.do ((params) => { // console.log ('2: thay đổi thông số url + thông số' + params ["id1"] + '' + params ["id2"]); this.id1 = params ["id1"]; this.id2 = params ["id2"]; }) }) – ObjectiveTC

+0

Hãy nhớ rằng bạn có thể chuyển 'dữ liệu' thành phần quá, có thể khác nhau cho mỗi tuyến đường ngay cả đối với cùng một thành phần. Ví dụ '{path: 'products', component: ProductsComponent, data: {showAllProducts: true}},' có thể được sử dụng và sau đó bạn kiểm tra 'showAllProducts'. Một chút đẹp hơn sau đó kiểm tra cho một null, nhưng đối với trường hợp đơn giản hoặc là có lẽ tốt. –

1

Ran vào một thể hiện của vấn đề này, và trong việc tìm kiếm một giải pháp cho nó đến đây. Vấn đề của tôi là tôi đã làm những đứa trẻ, và lười biếng tải các thành phần cũng như để tối ưu hóa mọi thứ một chút. Trong ngắn hạn nếu bạn đang lười tải mô-đun phụ huynh. Điều chính là sử dụng '/: id' của tôi trong tuyến đường, và nó khiếu nại về '/' là một phần của nó. Không phải là vấn đề chính xác ở đây, nhưng nó được áp dụng.

App-định tuyến từ mẹ

... 
const routes: Routes = [ 
    { 
    path: '', 
    children: [ 
     { 
     path: 'pathOne', 
     loadChildren: 'app/views/$MODULE_PATH.module#PathOneModule' 
     }, 
     { 
     path: 'pathTwo', 
     loadChildren: 'app/views/$MODULE_PATH.module#PathTwoModule' 
     }, 
... 

tuyến Child lười biếng nạp

... 
const routes: Routes = [ 
    { 
    path: '', 
    children: [ 
     { 
     path: '', 
     component: OverviewComponent 
     }, 
     { 
     path: ':id', 
     component: DetailedComponent 
     }, 
    ] 
    } 
]; 
... 
0
{path: 'users', redirectTo: 'users/'}, 
{path: 'users/:userId', component: UserComponent} 

Bằng cách này, thành phần không rerendered khi tham số được thêm vào.

Các vấn đề liên quan