Können Angularjs-Routen optionale Parameterwerte haben?

166

Kann ich eine Route mit optionalen Parametern festlegen (gleiche Vorlage und Controller, aber einige Parameter sollten ignoriert werden, wenn sie nicht vorhanden sind?

Haben Sie also nur eine, anstatt die folgenden zwei Regeln zu schreiben?

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 in der Art ([dieser Parameter ist optional])

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

Ich konnte nichts in ihrer Dokumentation finden.

Alexandru R.
quelle
Sie werden []in Version 1.1.5 (ohne ) ignoriert .
OZ_
Ja wirklich? Ich bin auf 1.1.5, habe es mit dem Code [: userId] versucht und ignoriere sie nicht.
Alexandru R
versuche es ohne []. Siehe dieses Commit: github.com/angular/angular.js/commit/…
OZ_
Hoppla, tut mir leid, es geht um $ resource, ich bin mir nicht sicher, ob es beim Routing funktioniert. Entschuldigen Sie.
OZ_
1
Wenn die Antwort von g-orge gut ist, würden Sie sie bitte markieren, damit die Leute nicht durch das Ganze scrollen müssen, um die beste Antwort zu finden?
AlexStack

Antworten:

243

Es sieht so aus, als ob Angular dies jetzt unterstützt.

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

pathkann optional benannte Gruppen mit einem Fragezeichen ( :name?) enthalten

George
quelle
7
Gibt es eine Möglichkeit, die Verwendung des abschließenden Schrägstrichs zu vermeiden? Wenn meine Route lautet: .when('/claims/documents/:CLAIMS_ID/:DOCUMENT_NAME?'...Sie stimmt nicht überein, wenn die URL keinen abschließenden Schrägstrich enthält. Also /claims/documents/1234/passt, aber /claims/documents/1234nicht.
James Bell
1
Ich würde gerne wissen, ob jemand eine Lösung für das von @JamesBell
Leiko
5
Ab Angular 1.3 ist das in den obigen Kommentaren erwähnte Problem mit dem abschließenden Schrägstrich behoben. Das Navigieren zu / Claims / Documents / 1234 / funktioniert ordnungsgemäß, ebenso wie / Claims / Documents / 1234. Kurz gesagt, es funktioniert mit oder ohne den nachgestellten Schrägstrich.
Judah Gabriel Himango
1
Ich sehe dieses Verhalten immer noch, wenn ich einen optionalen Parameter in meiner Route habe. Beispiel: Wenn die Route lautet: '/: Klassifikation? / Package / compare' und ich versuche, zur URL "/ package / compare" zu navigieren, funktioniert sie. Wenn ich aus irgendeinem Grund '/ package / compare /' versuche, wird der ASCI-Code an die Klassifizierung angehängt, oder '/% 3f / package / compare', was keine tatsächliche Route ist.
ruby_newbie
Die Dokumentation ist verwirrend.
Oliver Dixon
59

Wie @ g-eorge erwähnen, 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.

zmilan
quelle
8

Die Antwort von @jlareau finden Sie hier: /programming/11534710/angularjs-how-to-use-routeparams-in-generating-the-templateurl

Sie können eine Funktion verwenden, um die Vorlagenzeichenfolge 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:'/'});
    }
);
chrisjordanme
quelle
2

Eigentlich denke ich, dass OZ_ etwas richtig sein kann.

Wenn Sie die Route haben '/users/:userId'und zu navigieren '/users/'(beachten Sie das nachfolgende /), $routeParamssollte sich in Ihrem Controller ein Objekt befinden, das userId: ""in 1.1.5 enthalten ist. Nein, der Parameter userIdwird nicht völlig ignoriert, aber ich denke, es ist das Beste, was Sie bekommen werden.

Roy Daniels
quelle