Ist es möglich, einen optionalen Routenparameter in der Angular 2-Route zu haben? Ich habe die Angular 1.x-Syntax in RouteConfig ausprobiert, aber die folgende Fehlermeldung erhalten:
"ORIGINAL EXCEPTION: Path" / user /: id? "Enthält"? ", Was in einer Routenkonfiguration nicht zulässig ist."
@RouteConfig([
{
path: '/user/:id?',
component: User,
as: 'User'
}])
javascript
angular
Jeroen
quelle
quelle
RouteParams
nicht in eine Komponente importieren sollten, überprüfen Sie dies: stackoverflow.com/a/36792261/806202 . Die Lösung ist zu verwendenActivatedRoute
:route.snapshot.params['routeParam']
Auf diese Weise wird die Komponente beim Hinzufügen des Parameters nicht erneut gerendert.
quelle
pathMatch: 'full'
um umzuleiten, sonst werden Pfade wieusers/admin
auch in meinem Fall umgeleitet/users/all
oder/users/home
lesen Sie 'all' oder 'home' alsid
und ignorieren Sie ihn einfach, wenn er Ihrem magischen Wert entspricht. Dann wird die erste Zeile obenredirectTo: 'users/home'
oder was auch immer Sie entscheiden. Für mich ist ein abschließender Schrägstrich wirklich etwas, das nicht stimmt.Es wird empfohlen, einen Abfrageparameter zu verwenden, wenn die Informationen optional sind.
von https://angular.io/guide/router#optional-route-parameters
Sie müssen nur den Parameter aus dem Routenpfad entfernen.
quelle
Winkel 4 - Lösung zur Adressierung der Reihenfolge des optionalen Parameters:
MACH DAS:
Beachten Sie, dass die Routen
products
undproducts/:id
genau gleich benannt sind. Winkel 4 folgt korrektproducts
für Routen ohne Parameter, und wenn ein Parameter folgtproducts/:id
.Der Pfad für die Nicht-Parameter-Route
products
darf jedoch keinen abschließenden Schrägstrich enthalten, da sonst Angular ihn fälschlicherweise als Parameterpfad behandelt. In meinem Fall hatte ich also den nachgestellten Schrägstrich für Produkte und es funktionierte nicht.TUN SIE DAS NICHT:
quelle
data
an die Komponente übergeben können, die für jede Route auch für dieselbe Komponente unterschiedlich sein kann. Beispiel{path: 'products', component: ProductsComponent, data: { showAllProducts: true} },
könnte verwendet werden und dann suchen Sie nachshowAllProducts
. Ein bisschen schöner als nach einer Null zu suchen, aber für einfachere Fälle ist beides wahrscheinlich in Ordnung.Die Antwort von rerezz ist ziemlich nett, hat aber einen schwerwiegenden Fehler. Dadurch
User
wird diengOnInit
Methode von der Komponente erneut ausgeführt .Es kann problematisch sein, wenn Sie dort schwere Aufgaben ausführen und nicht möchten, dass diese erneut ausgeführt werden, wenn Sie von der nicht parametrischen zur parametrischen Route wechseln. Obwohl diese beiden Routen einen optionalen URL-Parameter imitieren sollen, werden sie nicht zu zwei separaten Routen.
Folgendes schlage ich vor, um das Problem zu lösen:
Dann können Sie die Logik verantwortlich für den Umgang mit dem param auf die bewegen
UserWithParam
Komponente und lassen Sie die Basis - Logik in derUser
Komponente. Was auch immer Sie tun,User::ngOnInit
wird nicht erneut ausgeführt, wenn Sie von / user zu / user / 123 navigieren .Vergessen Sie nicht, das
<router-outlet></router-outlet>
in dieUser
Vorlage des ' zu setzen .quelle
Die hier vorgeschlagenen Antworten, einschließlich der akzeptierten Antwort von rerezz das Hinzufügen mehrerer vorschlägt, funktionieren .
Die Komponente wird jedoch neu erstellt, wenn zwischen den Routeneinträgen gewechselt wird, dh zwischen dem Routeneintrag mit dem Parameter und dem Eintrag ohne Parameter.
Wenn Sie dies vermeiden möchten, können Sie einen eigenen Routen-Matcher erstellen, der beiden Routen entspricht:
Verwenden Sie dann den Matcher in Ihrer Routenkonfiguration:
quelle
Mit angle4 müssen wir nur Routen in Hierarchien zusammen organisieren
Das funktioniert bei mir. Auf diese Weise weiß der Router anhand der Options-ID-Parameter, welche Route die nächste ist.
quelle
Bin auf eine andere Instanz dieses Problems gestoßen und auf der Suche nach einer Lösung hierher gekommen. Mein Problem war, dass ich die Kinder machte und auch die Komponenten faul lud, um die Dinge ein wenig zu optimieren. Kurz gesagt, wenn Sie faul sind, laden Sie das übergeordnete Modul. Hauptsache, ich habe '/: id' in der Route verwendet und es gibt Beschwerden darüber, dass '/' ein Teil davon ist. Nicht das genaue Problem hier, aber es gilt.
App-Routing vom übergeordneten Element
Kinderrouten faul geladen
quelle
Ich kann nicht kommentieren, aber in Bezug auf: Angular 2 optionaler Routenparameter
ein Update für Angular 6:
Weitere Informationen zum Angular6-Routing finden Sie unter https://angular.io/api/router/ActivatedRoute .
quelle
Bei einem ähnlichen Problem mit dem verzögerten Laden habe ich Folgendes getan:
Und dann in der Komponente:
Diesen Weg:
Die Route ohne
/
wird auf die Route mit umgeleitet. Aufgrund dessenpathMatch: 'full'
wird nur eine solche spezifische vollständige Route umgeleitet.Dann
users/:id
wird empfangen. Wenn die tatsächliche Route warusers/
,id
ist""
, checken Sie sie einngOnInit
und handeln Sie entsprechend. Ansonstenid
ist die ID und fahren Sie fort.Der Rest der Komponente, auf die einwirkt,
selectedUser
ist undefiniert oder nicht (* ngIf und ähnliche Dinge).quelle