2013-07-07 12 views
151

Kann ich eine Strecke mit optionaler params (gleiche Vorlage und Controller eingestellt, aber einige params ignoriert werden sollten, wenn sie nicht existieren?Können angularjs Routen optionale Parameterwerte haben?

Anstatt also das Schreiben der beiden folgenden Regeln haben nur ein?

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

So etwas wie diese ([diese param ist optional])

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

ich etwas nicht in ihrer Dokumentation finden konnten.

+0

werden sie in der Version 1.1.5 ignoriert (ohne '[]'). –

+0

wirklich? Ich bin auf 1.1.5, habe versucht mit dem code [: userId] und ignoriert sie nicht. –

+0

versuchen ohne '[]'. Siehe dieses Commit: https://github.com/angular/angular.js/commit/53061363c7aa1ab9085273d269c6f04ac2162336 –

Antwort

225

Es sieht so aus, als hätte Angular jetzt Unterstützung dafür.

Von den neuesten (v1.2.0) docs für $routeProvider.when(path, route):

path können optional benannte Gruppen enthalten, die mit einem Fragezeichen (:name?)

+7

Kann der Schrägstrich nicht verwendet werden? Wenn meine Route lautet: '.when ('/ claims/documents /: CLAIMS_ID /: DOCUMENT_NAME?' ...' es wird nicht übereinstimmen, wenn die URL keinen abschließenden Schrägstrich hat. So '/ claims/documents/1234/'stimmt überein, aber'/claims/documents/1234' nicht. –

+1

Möchte wissen, ob jemand eine Lösung für das von @JamesBell gemeldete Problem hat. – Leiko

+5

Ab Angular 1.3 ist das in den obigen Kommentaren erwähnte Schrägstrichproblem Die Navigation zu/claims/documents/1234/funktioniert genauso wie/claims/documents/1234. Kurz gesagt, es funktioniert mit oder ohne den abschließenden Schrägstrich. –

2

Eigentlich denke ich, OZ_ könnte etwas korrekt sein.

Wenn Sie die Route '/users/:userId' und navigieren müssen '/users/' (beachten Sie die Hinter /), $routeParams in Ihrem Controller sollte ein Objekt sein userId: "" in 1.1.5 enthalten. Also nein der Parameter userId wird nicht vollständig ignoriert, aber ich denke, es ist das Beste, was Sie bekommen werden.

53

Wie @ g-eorge erwähnt, können Sie es so machen :

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

Sie können auch so viel machen, wie Sie optionale Parameter benötigen.

8

Bitte sehen @jlareau hier beantworten: https://stackoverflow.com/questions/11534710/angularjs-how-to-use-routeparams-in-generating-the-templateurl

Sie eine Funktion verwenden, können Sie die Vorlage Zeichenfolge zu generieren:

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 Sie Squash-Option verwenden können, wie in diesem Beitrag beantwortet wurde: 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

Dies ist nur für $ stateProvider und nicht für Angular $ routeProvider –

+0

Ich habe es für $ stateProvider verwendet. Ich weiß nichts über Kompatibilität mit $ routeProvider. – oyaebunterkrah

+5

@oyaebunterkrah Wenn Sie nicht wissen, dann bitte nicht antworten. –

Verwandte Themen