我想在我的LoginService中加载我的用户数据节点,并在加载其他服务之前等待,因为所有其他服务的路径的一部分取决于userdata。 (在我的情况下,我想在userdata节点中保存一个gameid - >例如我的用户已经签署了gameid:1 其他数据的路径是/ 1 / chat,...)
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&lt; - 此处崩溃,因为Login.service.ts中的observable未完成
//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/`)
}
}
任何人都可以告诉我如何解决这个问题?
答案 0 :(得分:1)
常见的方法是在protected void OnDeletingGw_Pack(Gw_Pack pack)
{
var trades = ModelContext.Gw_PackJunction.Where(e => e.PackID == pack.PackID).ToList();
if (pack.Groupage == true || trades.Count > 1)
{
// Don't delete a pack if it is a groupage container or if it's associated with more than one Trade.
throw new Exception("The container you are trying to delete is either marked as groupage or is functioning as a groupage container in another file.");
}
}
中提供Observable
,其中所有其他服务都可以订阅,LoginService
用于通知其他感兴趣的服务和组件有关状态更改。
LoginService
@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(...); }
}
}