2017-01-27 7 views
0

Ich habe eine App mit einer Login-Komponente und einer Home-Komponente und wenn der Benutzer sich angemeldet hat, möchte ich zur Home-Komponente navigieren. Ich möchte, dass die Login-Komponente nach der Authentifizierung ein "Login erfolgreich" -Ereignis ausgibt und die App-Komponente diese abhört und entsprechend navigiert. Ich kann jedoch nicht sehen, wie der Ereignis-Listener in der Rooting-Konfiguration hinzugefügt wird.Wie hören Sie Ereignisse als Teil der Routerkonfiguration?

Die meisten der Beispiele, die ich gesehen habe, betreffen das Navigieren innerhalb der Login-Komponente, aber dies scheint die Idee von eigenständigen Komponenten zu zerstören, da die Login-Komponente sowohl die Home-Komponente als auch das Rooten kennen muss Struktur der App

Ich möchte die Ausgabe der Login-Komponente verwenden, aber ich kann nicht sehen, wie dies beim Navigieren zum Login mit Router-Konfiguration zu tun.

<login (loginSuccess)="handleLoginSuccess($event)"></login>

Es gab auch eine längere Diskussion über Github (https://github.com/angular/router/issues/185), die Wurzeln, die Geschwister schlägt die Navigation wird nicht empfohlen.

Antwort

0

Unter der Annahme, dass die Ausgabe der Anmeldekomponente die Autorisierungsdaten sind, können Sie das Verhalten mit angular guard behandeln.

+0

Dies wird den gewünschten Effekt erzielen, aber mit der Login-Komponente, die für das Navigieren verantwortlich ist, bricht sicher die Idee, wiederverwendbare Komponenten zu haben. Ich wäre nicht in der Lage, diesen Ansatz zu verwenden, um eine Login-Komponente zu erstellen, die ich über verschiedene Apps teilen könnte. –

+0

Die Login-Komponente ist nicht für die Navigation verantwortlich, sie verbindet nur den Routenpfad. Router sollte für das Navigieren verantwortlich sein und der guard.service wird prüfen, ob der Benutzer die richtige Authentifizierung hat. –

0

Sie müssen möglicherweise einen shared service verwenden, um zwischen den Home- und Login-Komponenten zu kommunizieren, siehe this Antwort.

Wenn das Ziel nur darin besteht, die Anmeldekomponente erneut zu verwenden, können Sie die URL, an die Sie umleiten möchten, z. '/ home' über Routendaten.

In der Routendefinition:

... 
{ 
    path: 'login', 
    component: LoginComponent, 
    data: { 
    onLoginOk: '/home' 
    } 
} 

Und in LoginComponent ..

export class LoginComponent implements OnInit {  

onLoginOk: string; 

constructor(private route: ActivatedRoute) { } 

    ngOnInit() { 
    this.route.data.forEach((data: { onLoginOk: string }) => { 
     this.onLoginOk= data.onLoginOk; 
    }); 
    } 
... 

So ist das LoginComponent weiß nichts von der Heimat Komponente, er weiß nur, dass, wenn es erfolgreich anmeldet, es navigiert zu einer URL.

+0

Dies ist definitiv eine Verbesserung, aber es ist nicht ganz zufriedenstellend, weil, wenn ich zu einem späteren Zeitpunkt eine weitere Aktion hinzufügen möchte, erfolgreich Loggen Sie sich ein, ich muss die Login-Komponente wieder bearbeiten –

+0

Ja, das ist ein fairer Punkt. Ich denke, die beste Option ist dann, einen Dienst zu verwenden, wie von Gunter in der verknüpften Frage beschrieben. –

Verwandte Themen