Le rotte angularjs possono avere valori di parametri opzionali?


166

Posso impostare un percorso con parametri opzionali (stesso modello e controller, ma alcuni parametri dovrebbero essere ignorati se non esistono?

Quindi, invece di scrivere le seguenti due regole, ne hai solo una?

module.config(['$routeProvider', function($routeProvider) {
    $routeProvider.
     when('/users/', {templateUrl: 'template.tpl.html', controller: myCtrl}).            
     when('/users/:userId', {templateUrl: 'template.tpl.html', controller: myCtrl})
}]);

Qualcosa del genere ([questo parametro è facoltativo])

when('/users[/:userId]', {templateUrl: 'template.tpl.html', controller: myCtrl})
//note: this previous doesn't work

Non sono riuscito a trovare nulla nella loro documentazione.


saranno ignorati (senza []) nella versione 1.1.5.
OZ_

veramente? Sono su 1.1.5, ho provato con il codice [: userId] e non li ignoro.
Alexandru R

prova senza []. Vedi questo commit: github.com/angular/angular.js/commit/…
OZ_

oops, scusa, si tratta di $ resource, non sono sicuro che funzionerà nel routing. Mi scusi.
OZ_

1
Se la risposta di G-Orge è buona, la contrassegneresti in modo tale che le persone non debbano scorrere l'intera cosa per trovare la risposta migliore?
AlexStack,

Risposte:


243

Sembra che Angular abbia il supporto per questo ora.

Dagli ultimi documenti (v1.2.0) per $routeProvider.when(path, route):

pathpuò contenere gruppi nominativi opzionali con un punto interrogativo ( :name?)


7
Un modo per evitare di usare la barra finale? Se il mio percorso è: .when('/claims/documents/:CLAIMS_ID/:DOCUMENT_NAME?'...non corrisponderà se l'URL non ha una barra finale. Quindi /claims/documents/1234/corrisponde, ma /claims/documents/1234non lo fa.
James Bell,

1
Vorrei sapere se qualcuno ha una soluzione per il problema segnalato da @JamesBell
Leiko

5
A partire da Angular 1.3, il problema della barra finale menzionato nei commenti precedenti è stato risolto. La navigazione verso / reclami / documenti / 1234 / funziona correttamente, così come / reclami / documenti / 1234. In breve, funziona con o senza la barra finale.
Giuda Gabriel Himango,

1
Sto ancora vedendo questo comportamento se ho un parametro facoltativo nel mio percorso. Ad esempio: se il percorso è: '/: classificazione? / Pacchetto / confronto' e provo a navigare nell'URL "/ pacchetto / confronto", funziona. Se provo '/ package / compare /' per qualche motivo ottengo il codice ASCA aggiunto alla classificazione, o '/% 3f / package / compare' che non è un percorso effettivo.
ruby_newbie,

La documentazione è confusa.
Oliver Dixon,

59

Come menzione di @ g-eorge, puoi farlo in questo modo:

module.config(['$routeProvider', function($routeProvider) {
$routeProvider.
  when('/users/:userId?', {templateUrl: 'template.tpl.html', controller: myCtrl})
}]);

Puoi anche guadagnare quanto hai bisogno di parametri opzionali.


8

Si prega di consultare la risposta di @jlareau qui: /programming/11534710/angularjs-how-to-use-routeparams-in-generating-the-templateurl

È possibile utilizzare una funzione per generare la stringa del modello:

var app = angular.module('app',[]);

app.config(
    function($routeProvider) {
        $routeProvider.
            when('/', {templateUrl:'/home'}).
            when('/users/:user_id', 
                {   
                    controller:UserView, 
                    templateUrl: function(params){ return '/users/view/' + params.user_id;   }
                }
            ).
            otherwise({redirectTo:'/'});
    }
);

2

In realtà penso che OZ_ possa essere in qualche modo corretto.

Se hai il percorso '/users/:userId'e vai a '/users/'(nota il trailing /), $routeParamsnel tuo controller dovrebbe essere un oggetto contenente userId: ""in 1.1.5. Quindi nessun parametro userIdnon è completamente ignorato, ma penso che sia il migliore che otterrai.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.