Angular: Alle Routensegmentkonfigurationen werden nach URL aufgelöst

8

Gegeben eine URL, z.B. /path/path2/path3/123;sdf=df und eine Routenkonfiguration:

%Vor%

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?

    
smnbbrv 31.03.2017, 14:50
quelle

2 Antworten

4

Mit der Version 2.x können Sie die Funktion recognize verwenden, die der Router intern verwendet, um eine URL mit einer RouteStateSnapshot abzugleichen.

%Vor%

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.

    
smurfy 09.04.2017, 08:33
quelle
1

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.

    
Tyler Jennings 31.03.2017 15:24
quelle