1
他のすべてのサービスへのパスの一部がuserdataに依存するため、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/`)
}
}
誰でも私にこの問題を解決する方法を教えていただけますか?
、私は同様の方法で、すでにこれを試みたが、私の問題は、コンストラクタで観察が終了する前に、チャットのGetLastの方法が処理されるということでした。コンソールでは、次のようになります。 Line1 getLast。 ID。未定義 Line2 Angularは開発モードで実行されています。プロダクションモードを有効にするには、enableProdMode()を呼び出します。 Line3コンストラクタ。 ID。 1 –
どこで 'getLast()'を呼び出しますか?私が 'this.init()'を書いた 'getLast()'の呼び出しはどうでしょうか? –
私のapp.component.tsではgetLast()が呼び出されていますが、これは私のアプリケーションで使用されている私の全サービスの1つです。また、app.component.tsによってルーティングされるdashboard.component.tsもあります。ここでは、コンポーネントのngInit()で呼び出される他の多くのサービス呼び出しがあります。 –