1

他のすべてのサービスへのパスの一部がuse​​rdataに依存するため、LoginServiceに自分のユーザーデータノードをロードして他のサービスがロードされるのを待っています。 (私の場合、私はuserdataノードにgameidを保存したいと思います - >例えば、私のユーザーはgameidを割り当てました:1 他のデータへのパスは/ 1/chat ...)LoginServiceにロードされたuserdataを待つ

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 <は - Login.service.tsで観察が終了していないので、ここではクラッシュし

//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/`) 
    } 

} 

誰でも私にこの問題を解決する方法を教えていただけますか?

答えて

1

一般的な方法は、他のすべてのサービスが購読してLoginServiceステータスの変化について、他の興味のサービスやコンポーネントに通知するために使用することができますLoginServiceObservableを提供することです。あなたの答えに感謝@guenter

@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

、私は同様の方法で、すでにこれを試みたが、私の問題は、コンストラクタで観察が終了する前に、チャットのGetLastの方法が処理されるということでした。コンソールでは、次のようになります。 Line1 getLast。 ID。未定義 Line2 Angularは開発モードで実行されています。プロダクションモードを有効にするには、enableProdMode()を呼び出します。 Line3コンストラクタ。 ID。 1 –

+0

どこで 'getLast()'を呼び出しますか?私が 'this.init()'を書いた 'getLast()'の呼び出しはどうでしょうか? –

+0

私のapp.component.tsではgetLast()が呼び出されていますが、これは私のアプリケーションで使用されている私の全サービスの1つです。また、app.component.tsによってルーティングされるdashboard.component.tsもあります。ここでは、コンポーネントのngInit()で呼び出される他の多くのサービス呼び出しがあります。 –

関連する問題