2017-10-31 2 views
-1

Ich werde versuchen, dies so einfach und so knapp wie möglich zu halten.Aktualisieren von Komponenten aus einer anderen Komponente in angular4

Wir verwenden Angular 4. Normalerweise wäre die Lösung das Hinzufügen von Beobachtern in früheren Versionen, aber diese sind nicht mehr in der Nähe, so dass Sie ein wenig Praxiswissen benötigen, um eine Lösung für ein wahrscheinlich einfaches Problem zu implementieren.

Wir haben 3 Komponenten innerhalb unserer main.ts

<header_component></header_component> 
<router_outlet></router_outlet> 
<footer_component></footer_component> 

Datei, so werden wir Probleme haben, wenn sie die Ansichten (Komponenten) auf Protokoll und Abmelden an erfrischenden kommt.

Bei "Anmeldung" wird ein separates router_outlet verwendet und bei erfolgreicher Anmeldung navigieren wir zur Benutzertabelle und dies veranlasst die Init, die Benutzer neu zu laden. Da dies jedoch nur das router_outlet ändert, wird die Kopfzeile nicht aktualisiert, um die Optionen "logout" und "reset password" anzuzeigen. Die Lösung hierfür müsste sowohl auf der headed_component als auch auf dem router_outlet eine Aktualisierung auslösen.

Das zweite Problem ist, dass bei "Abmelden" dies innerhalb der Header_Komponente getan wird, so ändern sich die Optionen in der Kopfzeile zu "Login" und "Passwort vergessen". Das Problem dieses Mal ist, dass das router_outlet nicht aktualisiert wird, um die zusätzliche Funktionalität zu entfernen, die Sie sich beim Anmelden (Bearbeiten, Löschen, Hinzufügen) von Benutzern verschaffen können.

Ich habe die Angular.io angeschaut und die Dokumentation deckt nicht wirklich das Setup, das wir verwenden. Zugegeben, das könnte meine Interpretation sein.

Irgendwelche Ideen werden geschätzt.

Vielen Dank im Voraus

Lewis

UPDATE: Okay, so machen Ich habe auf diese einige Fortschritte aber ich ein bisschen eine Sackgasse getroffen haben

ich das beobachtbare Konzept umgesetzt haben

headerComponent hat constructor(private _loginService: LoginService, private _authService: AuthService) { this.isLoggedIn = _loginService.getLoggedInStatus.subscribe((loggedIn: boolean) => this.changeLoggedInStatus(loggedIn)); }

die usercomponent hat auch viel die gleiche

Die loginService hat `Exportklasse LoginService { @Output() getLoggedInStatus: EventEmitter = new EventEmitter();

isLoggedIn(): Observable<boolean> { 
    var currentUser = JSON.parse(localStorage.getItem('currentUser')); 
    if (currentUser) { 
     this.getLoggedInStatus.emit(true); 
     return (true) as any; 
    } else { 
     this.getLoggedInStatus.emit(false); 
     return (false) as any; 
    } 
} 

On logout i Feuer this.getLoggedInStatus.emit(false) aber dies wird nicht von der usercomponent

irgendwelche Ideen aufgenommen?

+0

Sie erwähnen, dass die Dokumente nicht Ihre Einrichtung abdecken, aber bietet https://angular.io/guide/component-interaction#parent-and-churchs-communicate-via-a-service kein Muster, das Sie übernehmen können? – jonrsharpe

+0

Das ist also gut für die Berichterstattung, aber es gibt keine Eltern-Kind-Verbindung zwischen der Header-Komponente und den Komponenten, die vom Router_outlet geladen werden. Hier erschien das Problem. Wir haben uns den ChangeDetectorRef angeschaut, der besser geeignet scheint, aber wir haben Probleme bei der Implementierung dieses Problems. Deshalb schlug ich ein Beispiel der realen Welt vor. – Lewis

+0

Ja, das ist genau warum Du über einen Dienst * kommunizierst. – jonrsharpe

Antwort

0

Verwenden Sie einen Dienst, der Ihnen den Benutzerstatus i: e zurückgibt, ob der Benutzer angemeldet ist oder nicht.

isLoggedIn(){ 
    return true //if user is logged in 
    or 
    return false // if the user is not logged in 
} 

Dann in Ihrem Header-Komponente können Sie diesen Dienst rufen Sie den Benutzerstatus zu überprüfen und ein Flag auf der Grundlage der Antwort

userFlag = serviceName.isLoggedIn(); 

in der HTML-Datei dieses Flag verwenden, um die gewünschten Etiketten anzuzeigen basierend i am userflag : e, wenn userFlag wahr ist (Benutzer angemeldet) dann

<div *ngIf="userFlag"> 
    display "logout" and "reset password" 
</div> 
<div *ngIf="!userFlag"> 
    display "login" and "forgot password" 
</div> 

Sie können auch einen Versuch zu Angular Obsevables geben

+0

Vielen Dank für Ihre Antwort. Das ist ähnlich wie das, was wir haben, also ist es gut zu wissen, dass es in der richtigen Richtung ist. Ich werde den Dienst auf der Grundlage sowohl Ihrer Antwort und @ jonrsharpe Vorschlag implementieren und später aktualisieren – Lewis

+0

Also habe ich den Dienst implementiert und dies verdrahtet. Das Problem ist jedoch immer noch dort, wo das DOM nicht aktualisiert wird. Irgendwelche Ideen, wie man das DOM zum Aktualisieren auslöst? – Lewis

+0

Sie können ein beobachtbares Konzept ausprobieren, bei dem Sie eine Änderung abonnieren und den Inhalt entsprechend ändern können. Es wird Ihnen auch in Zukunft hilfreich sein. – Gautam

Verwandte Themen