1

Ich möchte meinen Benutzerdatenknoten in meinem LoginService laden und warten, bevor andere Dienste geladen werden, da ein Teil des Pfades zu allen anderen Diensten von den Benutzerdaten abhängt. (In meinem Fall möchte ich eine Spiel-ID im Userdata-Knoten speichern -> zum Beispiel hat mein Benutzer Gameid: 1 der Pfad zu anderen Daten wäre/1/Chat, ...)Warten auf geladene Benutzerdaten in LoginService

Auth.guard. ts

//Angular 
import { Observable } from 'rxjs/Rx'; 
import { Injectable } from '@angular/core'; 
import { CanActivate, Router, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; 
//Services 
import { LoginService } from '../services/login.service'; 

@Injectable() 
export class AuthGuard implements CanActivate{ 

    constructor(
    private router: Router, 
    private loginService: LoginService, 
){} 

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean { 
    return this.loginService.getAuthenticated().map(user => { 
      this.loginService.setUser(user); 
      if(user) { 
      return true; 
      } else { 
      this.router.navigate(['/login']); 
      return false; 
      } 
    }) 
    } 

} 

Login.service.ts

//Angular 
import { Injectable, Inject }  from '@angular/core'; 
import { Router } from '@angular/router'; 
import { Http, Response, Headers, RequestOptions } from '@angular/http'; 
//Rxjs 
import { Observable } from 'rxjs'; 
//Firebase 
import { AngularFire, AuthProviders, FirebaseAuthState, FirebaseListObservable, FirebaseObjectObservable, AuthMethods, FirebaseApp } from 'angularfire2'; 
//Models 
import { LoginModel } from '../models/login'; 

@Injectable() 
export class LoginService { 

    public user: any; 
    public firebase: any; 
    public gameid: String; 

    constructor (
     private router: Router, 
     public af: AngularFire, 
     @Inject(FirebaseApp) firebase: any 
    ){ 
     this.firebase = firebase; 
    } 

    setUser(user): void { 
     this.user = user; 
     //update last activity 
     if(this.user != undefined && this.user != null){ 
      this.af.database.object(`users/${this.user.uid}`).subscribe(user => { this.gameid = user.gameid } 
     } 
    } 

Chat.service.ts < - hier stürzt, weil die beobachtbaren Login.service.ts nicht

beendet ist
//Angular 
import { Injectable } from '@angular/core'; 
import { Router } from '@angular/router'; 
import { Http, Response, Headers, RequestOptions } from '@angular/http'; 
import { Observable } from 'rxjs'; 
//Firebase 
import { FirebaseListObservable, FirebaseObjectObservable } from 'angularfire2'; 
//Services 
import { LoginService } from '../services/login.service'; 
import { MembersService } from '../services/members.service'; 
//Models 
import { ChatModel } from '../models/chat'; 

@Injectable() 
export class ChatService { 

    constructor (
     private loginService: LoginService, 
     private membersService: MembersService, 
     private router: Router 
){} 

    getLast(): Observable<any> { 
     return this.loginService.af.database.list(this.loginService.gameid+`/chat/`) 
    } 

} 

kann jemand mir eine Idee geben, wie man das löst?

Antwort

1

Der übliche Weg ist, eine Observable in LoginService, wo alle anderen Dienste abonnieren können und die LoginService verwendet, um andere interessierte Dienste und Komponenten über Statusänderungen zu benachrichtigen.

@Injectable() 
export class LoginService { 
    private loginData:Subject = new BehaviorSubject(); 
    public loginData$ = this.loginData.asObservable(); 

    setUser(user): void { 
    this.user = user; 
    //update last activity 
    if(this.user != undefined && this.user != null){ 
     this.af.database.object(`users/${this.user.uid}`).subscribe(user => { this.gameid = user.gameid; 
this.loginData.next(...); } 
    } 
} 
@Injectable() 
export class ChatService { 

    constructor (
     private loginService: LoginService, 
     private membersService: MembersService, 
     private router: Router 
){ 
    loginService.loginData.filter(ld => ld != null).subscribe(res => 
     this.loginData = res; 
     this.init(); // do additional initalization 
    }); 
    } 
+0

@guenter Dank für Ihre Antwort, habe ich versucht, dies bereits in ähnlicher Weise, aber mein Problem war, dass die GetLast Methode des Chat vor dem beobachtbaren im Konstruktor verarbeitet wird, beendet ist. In der Konsole sieht das so aus: Line1 getLast. ICH WÜRDE. undefined Line2 Angular läuft im Entwicklungsmodus. Rufen Sie enableProdMode() auf, um den Produktionsmodus zu aktivieren. Line3-Konstruktor. ICH WÜRDE. 1 –

+0

Wo rufst du 'getLast()'? Was ist mit dem Aufruf von 'getLast()', wo ich 'this.init()' geschrieben habe? –

+0

getLast() wird in meiner app.component.ts aufgerufen, aber dies ist nur einer meiner ganzen Dienste, die in meiner App verwendet werden .. Ich habe auch eine dashboard.component.ts, die von app.component.ts weitergeleitet wird, wo ich viele andere Serviceaufrufe habe, die an der ngInit() der Komponente aufgerufen werden. –

Verwandte Themen