2012-09-21 18 views
30

Posso impostare un valore predefinito di un parametro di una rotta in AngularJS? C'è un modo per avere /products/123 e /products/ gestito dallo stesso percorso?I percorsi angularjs possono avere valori di parametri predefiniti?

sto cercando di refactoring il mio codice esistente, che si presenta come:

myModule.config(['$routeProvider', function($routeProvider) { 
    $routeProvider. 
    when('/products/', {templateUrl: 'products.html', controller: ProductsCtrl}).    
    when('/products/:productId', {templateUrl: 'products.html', controller: ProductsCtrl}) 
}]); 


function ProductsCtrl($scope, $routeParams) { 
    $scope.productId = typeof($routeParams.productId) == "undefined" ? 123 : $routeParams.productId; 
} 

Funziona, ma non è molto elegante. C'è un modo migliore ?

+0

non hanno familiarità con angularJS, ma per quanto riguarda 'var param = {TemplateURL: 'prodotti.html', regolatore : ProductsCtrl}; $ routeProvider.when ('/ products /', param) .when ('/ products /: productId', param) '? – Rufus

+3

È possibile semplificare un po 'il codice del controller con: $ scope.productId = $ routeParams.productId || 123; – Gloopy

+0

@Gloopy questo ovviamente funziona se productId == 0 non è un ID valido –

risposta

24

AngularJS non consente valori predefiniti per i parametri del percorso.

Ma i percorsi (in AngularJS) non devono avere parametri predefiniti.

Le risorse potrebbero avere parametri predefiniti.

Se si desidera un percorso con un parametro opzionale, in realtà sono due percorsi diversi.

Perché?

  • percorsi devono essere semplici

  • Routes non consente espressioni regolari che corrispondono ai parametri

  • Routes non sono qualcosa che espone un'API per lavorare nella vostra applicazione (a differenza Risorse fare). Le rotte sono solo configurazione che collega un URL con un modello e un controller. Quindi avere più percorsi è meglio:

    • E 'chiaro quale route route a quale URL.

    • È più prolisso, ma più semplice da leggere. Avere percorsi più complessi creerebbe una curva di apprendimento più ripida in cui AngularJS non ne ha bisogno.

differenza framework lato server che hanno percorsi

  • AngularJS vie non hanno nome.
  • Non si creano URL dagli itinerari definiti.
  • Non si dispone della logica (funzioni a.k.a) nelle definizioni di percorso.

Percorsi più semplici = più righe per definirli = meno mal di testa che lavorano con loro.

NOTA: Si prega di tenere presente la domanda e questa risposta è per una vecchia versione di AngularJS (1.0 Penso) pre-datazione della nuova implementazione di percorsi/risorse.

+19

Anche se questa potrebbe essere la risposta corretta, non vedo alcun argomento valido qui che dovrebbe impedire ad AngularJS di avere parametri predefiniti o una migliore corrispondenza di percorso. La ripetizione di codice identico è sempre un problema per la manutenzione. –

+0

@ edA-qamort-ora-y Il mio punto è che nello stato attuale delle rotte AngularJS (che probabilmente cambierà) le rotte dovrebbero essere mantenute semplici. –

+1

Anche se questa conversazione è un po 'datata, ho sentito che nella versione 2 di Angular ci sarà il supporto per la corrispondenza dei pattern per i percorsi, questo può anche includere un modo per fare parametri opzionali o predefiniti. – shaunhusain

34

Riconosco che questa domanda è vecchia, ma ancora: perché non si reindirizza semplicemente l'URL "vuoto" a uno contenente l'ID prodotto predefinito?

myModule.config(['$routeProvider', function($routeProvider) { 
    $routeProvider. 
    when('/products/', {redirectTo: '/products/123'}). 
    when('/products/:productId', {templateUrl: 'products.html', controller: ProductsCtrl}) 
}]); 
+0

Metodo di sovraccarico FTW! –

6

Avevo un requisito simile. Quello che ho fatto è stato creare una funzione da risolvere. Qualcosa di simile al di sotto

myModule.config(['$routeProvider', function($routeProvider) { 
$routeProvider. 
when('/products/', resolveProduct()).    
when('/products/:productId', resolveProduct()) 
}]); 


function ProductsCtrl($scope, $routeParams) { 
$scope.productId = $routeParams.productId; 
} 

function resolveProduct() { 
    var routeConfig = { 
     templateUrl: 'products.html', 
     controller: ProductsCtrl, 
     resolve: { 
     productId: ['$route', function($route){ 
      var params = $route.current.params; 
      params.productId = params.productId || 123; 
     }] 
     } 
    } 

    return routeConfig; 
} 
2

Con url: "/ view /: id /: lo stato?", è possibile indicare un parametro opzionale.

Pensavo che qualcuno potrebbe averne bisogno.

1

Non sono sicuro se questa domanda è specifico per $routeProvider ma in $stateProvider, è possibile raggiungere questo obiettivo

myApp.config(function($stateProvider) { 

    $stateProvider 
     .state('products', { 
      url: '/:productId', 
      templateUrl: "/dashboard/products.html", 
      controller: 'ProductController', 
      params: { 
       productId: { 
        value: "defaultValue", 
        squash: true // or enable this instead to squash `productId` when empty 
       } 
      } 
     }); 
}); 
Problemi correlati