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?
@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 –
Wo rufst du 'getLast()'? Was ist mit dem Aufruf von 'getLast()', wo ich 'this.init()' geschrieben habe? –
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. –