2015-12-10 36 views
69

È possibile avere un parametro di percorso opzionale nel percorso Angolare 2? Ho provato la sintassi 1.x angolare in RouteConfig ma ha ricevuto sotto l'errore:Parametro percorso angolare 2 opzionale

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

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

risposta

117

È possibile definire più percorsi con e senza parametri:

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

e gestire il parametro opzionale nel componente :

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

    if (paramId) { 
     ... 
    } 
} 

Vedi anche il relativo problema github: https://github.com/angular/angular/issues/3525

+7

Correggetemi se ho torto, ma questa soluzione ha funzionato per me solo quando l'ordine dei percorsi nell'array è stato invertito, cioè il percorso con il parametro si è verificato prima dell'altro. Finché non l'ho fatto, il router ha abbinato solo la rotta senza il parametro. –

+0

@Aviad P L'ordine non ha importanza per me quando ho chiamato 'router.navigate (['/ user', {id: 2}]);', ma _did_ importa quando ho chiamato 'router.navigate (['/user ', 2]); '. In quest'ultimo caso, la rotta con il parametro ID doveva essere definita prima del percorso senza parametri. – reduckted

+6

questa soluzione è ancora valida? Ho notato che passare da "Utente" a "UtenteNuovo" riattiva il componente "Utente" – teleaziz

22

Si consiglia di utilizzare un parametro di query quando l'informazione è facoltativa.

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.

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

Hai solo bisogno di togliere il parametro dal percorso percorso.

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

Modifica dei parametri del componente di runtime dei parametri opzionali, ma la modifica di queryParam non lo fa. Inoltre, se si risolvono alcuni dati prima della navigazione del percorso, verrà richiesto ogni volta che si modificano i parametri del percorso facoltativo. – neilhem

2

Con angular4 abbiamo solo bisogno di organizzare percorsi insieme nella gerarchia

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 
    } 
]; 

Questo funziona per me. In questo modo il router conosce qual è il prossimo percorso in base ai parametri dell'opzione.

4

angolare 4 - Soluzione per affrontare l'ordinamento del parametro opzionale:

fare questo:

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

Si noti che le products e products/:id percorsi prendono il nome esattamente lo stesso. Angular 4 seguirà correttamente products per rotte senza parametro e se un parametro seguirà products/:id.

Tuttavia, il percorso per il percorso non parametrico products deve non avere una barra finale, altrimenti angolare lo tratterà non correttamente come percorso parametro. Quindi nel mio caso, ho avuto la barra finale per i prodotti e non funzionava.

non farlo:

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

Se entrambi stanno andando a ProductsComponent, come si gestisce il parametro opzionale lì? – Arwin

+0

È possibile accedere ai parametri: id1,: id2, ecc. Così come l'URL richiesto in ProductsComponent in questo modo: this.route.url.first() .mergeMap ((url) => { // console.log ('1: url change detected' + url); return this.route.params.do ((params) => { // console.log ('2: url + params change detected' + params ["id1"] + '' + params [ "ID2"]); this.id1 = params [ "ID1"]; this.id2 = params [ "ID2"];} ) }) – ObjectiveTC

+0

Ricorda che puoi passare 'data' anche al componente, che può essere diverso per ogni percorso anche allo stesso componente. Esempio '{percorso: 'prodotti', componente: ProductsComponent, data: {showAllProducts: true}},' potrebbe essere usato e quindi si controlla 'showAllProducts'. Un po 'più bello quindi verificare un nulla, ma per i casi più semplici è probabilmente bene. –

1

imbattuto in un'altra istanza di questo problema, e nella ricerca di una soluzione per è venuto qui. Il mio problema era che stavo facendo i bambini, e il carico pigro dei componenti, per ottimizzare un po 'le cose. In breve, se si è pigri a caricare il modulo genitore. La cosa principale era usare il mio '/: id' nel percorso, ed è una lamentela sul fatto che '/' ne faccia parte. Non è esattamente il problema qui, ma si applica.

App-instradamento da genitore

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

percorsi Bambino pigro caricato

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

In questo modo il componente non il rendering viene eseguito quando viene aggiunto il parametro.

Problemi correlati