2013-07-07 9 views
151

Posso impostare un percorso con params opzionali (stesso modello e il controller, ma alcuni params dovrebbe essere ignorato se non esistono?I percorsi angularjs possono avere valori di parametro facoltativi?

Così, invece di scrivere le seguenti due regole, hanno una sola?

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

qualcosa di simile ([questo parametro è facoltativo])

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

non ho trovato nulla nella loro documentazione.

+0

verranno ignorati (senza '[]') nella versione 1.1.5. –

+0

davvero? Sono su 1.1.5, provato con il codice [: userId] e non li ignoro. –

+0

provare senza '[]'. Vedi questo commit: https://github.com/angular/angular.js/commit/53061363c7aa1ab9085273d269c6f04ac2162336 –

risposta

225

Sembra che Angular ora supporti questo supporto.

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

path possono contenere gruppi denominati opzionali con un punto interrogativo (:name?)

+7

Un modo per evitare l'uso della barra finale? Se la mia rotta è: '.quando ('/ claims/documents /: CLAIMS_ID /: DOCUMENT_NAME?' ...' non corrisponderà se l'url non ha una barra finale. '/ Claims/documents/1234/'corrisponde, ma'/claims/documents/1234' no. –

+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 è corretto. Navigando in/claims/documents/1234/funziona correttamente, così come/claims/documents/1234. In breve, funziona con o senza la barra finale. –

2

In realtà penso che OZ_ possa essere alquanto corretto.

Se avete il percorso '/users/:userId' e navigare a '/users/' (notare il finale /), $routeParams nel controller dovrebbe essere un oggetto contenente userId: "" in 1.1.5. Quindi nessun parametro userId non è completamente ignorato, ma penso che sia il meglio che otterrai.

53

Come @ g-eorge menzione, si può fare in questo modo :

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

È anche possibile effettuare quanto necessario per i parametri opzionali.

8

Si prega di vedere @jlareau risposta qui: https://stackoverflow.com/questions/11534710/angularjs-how-to-use-routeparams-in-generating-the-templateurl

È possibile utilizzare una funzione per generare la stringa di 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:'/'}); 
    } 
); 
0

@JamesBell È possibile utilizzare l'opzione squash è stato risposto in questo post: app state with optional param and no trailing slash

.state('path', { 
    url: '/path/:param1', 
    params: { 
     param1: { 
      value: null, 
      squash: true 
     } 
    }, 
    views: { 
     'map-tab': { 
      templateUrl: 'templates/map.html', 
      controller: 'testCtrl' 
     } 
    } 
}) 
+0

Questo è solo per $ stateProvider e non per $ routeProvider di Angular –

+0

L'ho usato per $ stateProvider. Non so sulla compatibilità con $ routeProvider. – oyaebunterkrah

+5

@oyaebunterkrah Se non lo sai, per favore non rispondere. –

Problemi correlati