Gegeben eine URL, z.B. /path/path2/path3/123;sdf=df
und eine Routenkonfiguration:
Was ich brauche, ist eine tatsächliche Konfiguration für alle Segmente zu finden, um eine Ergebnismenge aller data
-Parameter auf allen Ebenen (jedes Segment der URL) zu erhalten.
Ich kann die URL in den Segmenten aufteilen, z. B.
%Vor%oder genauer gesagt
%Vor%was zurückkommt
%Vor%Das Teilen der URL in Segmente ist also kein Problem. Allerdings muss ich für jedes Segment eine Konfiguration bekommen.
Ich kann die tatsächliche Konfiguration für alle Routen mit
erhalten %Vor% Ich kann mit den Segmenten durch den Konfigurationsbaum gehen und den Zweig finden, den ich brauche, aber er kann Probleme verursachen, z. beim Auflösen von :id
gegen create
segment. Also würde ich gerne den Router Weg der Auflösung der Konfiguration verwenden, dass, wenn die innere Router-Implementierung ändert, ich nicht ändern müsste.
Beispiel: Stellen Sie sich vor, ich hätte 50% der URLs durch einen Wächter geschützt (z. B. nur eingeloggte Benutzer könnten dorthin gehen) und andere 50% sind nicht geschützt (für alle sichtbar). Auf der Ebene des Navigationsmenüs (außerhalb von router-outlet
) möchte ich nur die Links anzeigen, die für den aktuellen Benutzer relevant sind. Daher muss ich wissen, welche Routen vom Wächter geschützt werden. Guards / Daten / was auch immer ist nur ein spezieller Fall des Problems.
Bitte halten Sie sich nicht an das Beispiel . Ich suche nach einer allgemeinen Methode, um den Konfigurationssatz für eine bestimmte URL zu erhalten.
Ist das überhaupt möglich?
Mit der Version 2.x können Sie die Funktion recognize
verwenden, die der Router intern verwendet, um eine URL mit einer RouteStateSnapshot
abzugleichen.
Leider scheint das mit Version 4.x nicht mehr zu funktionieren. Für Version 4.x habe ich eine Pull-Anforderung erstellt, um der Router
eine neue Methode hinzuzufügen, um die Erkennungsfunktion verfügbar zu machen.
Eine weitere Randnotiz. Sinnvoll ist es auch, Fehler des Versprechens (entweder der recognize- oder der new router-Methode) zu behandeln, indem .catch((rej) => { // some code if it fails to resolve route })
hinzugefügt wird. Es kann passieren, dass es den url- & gt; routstatesnapshot nicht auflöst. Entweder weil die URL falsch ist oder du asynchrone Routen über LoadChildren
verwendest und die Routen noch nicht geladen sind. Breadcrumbs funktionieren hervorragend, sogar mit asynchronen Routen. Wenn Sie es zum Überprüfen von Berechtigungen verwenden, z. B. über eine Direktive, müssen Sie darauf achten, ob Sie asynchrone Routen verwenden.
Es gibt eine andere Möglichkeit, die Datenkonfiguration für Routen zu erhalten. Es beinhaltet die Kenntnis der Eigenschaft key
im Datenobjekt.
In Ihrer Komponente können Sie die Daten für diese exakte Route mit
abrufen %Vor%Sie können die Daten der Eltern mit
abrufen %Vor%Oder sogar die Daten der Großeltern mit
%Vor%Da Sie auf all Ihren Routen verschiedene Schlüssel verwenden, wird das schwieriger. In diesem Fall müssten Sie eine Liste der Schlüssel abrufen und darüber iterieren:
%Vor%Wenn Sie Ihre URL-Segmente kennen, können Sie sogar darauf abstimmen, um die Konfiguration für einen bestimmten Pfad zu erhalten:
%Vor%Eine grobe Lösung, um alle Daten zu erhalten, die Sie brauchen, würde etwa so aussehen:
%Vor%Dies hilft Ihnen hoffentlich dabei, die richtigen Daten zu bekommen.
BEARBEITEN
Ich habe die ursprüngliche Frage vielleicht falsch verstanden.
Seit dem Hinzufügen von:
Warum sollte ich das brauchen? Stellen Sie sich vor, ich habe 50% der URLs geschützt von einige Wächter (z. B. nur eingeloggte Benutzer könnten dorthin gehen) und andere 50% sind nicht geschützt (für alle sichtbar). Also, im Navigationsmenü Level (außerhalb des Router-Outlet) Ich möchte nur die Links anzeigen Welche sind relevant für den aktuellen Benutzer, also muss ich wissen welche Routen werden von der Wache geschützt. Guards / Daten / was auch immer ist nur ein besonderen Fall des Problems.
Die Art und Weise, wie ich das Problem des Versteckens von Links gelöst habe, dass nicht authentifizierte Benutzer Links sehen oder verbergen konnten, die nicht autorisierte Benutzer sehen konnten, besteht darin, eine Funktion für meinen Authentifizierungsdienst zu erstellen, die entweder überprüfen kann, ob ein Benutzer authentifiziert oder autorisiert ist. Es ist dieselbe Funktion, die auch meine Wachen auf meinen Routen benutzen.
Zum Beispiel kann ich einen CheckPermissions
-Wächter auf meinen Routen mit den Routendaten haben data: { permissions:[permission1, permission2] }
Hinter den Kulissen verwendet dieser Wächter eine Funktion im Auth-Dienst, um zu prüfen, ob der Benutzer über die in den Daten aufgeführten Berechtigungen verfügt Feld. Ich kann diese Funktion auch vom Auth-Dienst verwenden, um Links in meinem Hauptmenü mit *ngIf="authSvc.CheckPermission(permission1)
usw. zu verstecken. Auf diese Weise muss ich die Logik nirgends duplizieren. Letztendlich sollten die API-Endpunkte auch serverseitig geschützt sein.
Um dem Router eine URL zu geben und die passende Route zurück zu bekommen, ohne zu dieser zu navigieren, kann ich keinen dokumentierten Weg finden, dies zu tun. Hoffe das ist zumindest ein bisschen Hilfe.
Tags und Links angular typescript angular2-router