2016-12-15 52 views
0

我試圖從當前登錄的用戶獲取用戶標識以自定義從我的DataService加載的數據。 我的目標是:在使用Angular2和Firebase啓動服務之前設置從AuthGuard服務的值

  1. 的AuthGuard應InboxComponent之前調用加載
  2. AuthGuard應設置用戶變量在AuthService
  3. 我應該再能使用DataService中的authService.user

但是,console.log(this.authService.user)收益率未定義,但AuthGuard中的console.log(authState)正確記錄用戶信息。

任何可能出錯的線索?

驗證服務

export class AuthService { 

    public user: any; 

    constructor(private af: AngularFire, public auth$: FirebaseAuth) { 
    console.log("Auth service state:", this.authState); 
    } 

AuthGuard

@Injectable() 
export class AuthGuard implements CanActivate { 
    constructor(private authService: AuthService, private router: Router) {} 

    canActivate(): Observable<boolean> { 
    return this.authService.auth$ 
     .take(1) 
     .map(authState => { 
     console.log(authState) 
     this.authService.setUser(authState); 
     return !!authState }) 
     .do(authenticated => { 
     if (!authenticated) { 
      this.router.navigate(['/error']); 
     } 
     }); 
    } 

} 

的DataService

export class DataService { 

    private userPath: string; 

    constructor(private af: AngularFire, private authService: AuthService) { 
    console.log(this.authService.user); 
    } 

路由器

const routes: Routes = [ 
    { path: 'inbox', component: InboxComponent, canActivate: [AuthGuard] } 

APP模塊

@NgModule({ 
    declarations: [ 
    InboxComponent 
    ], 
    imports: [ 
    EmailsModule 
    ], 
    providers: [ 
    AuthService, 
    AuthGuard 
    ], 
    bootstrap: [AppComponent] 
}) 
export class AppModule { } 
+0

AuthService是單身嗎?你在哪裏提供*它? – Sasxa

+0

我用模塊導入代碼編輯了我的問題。我在App Module中導入AuthGuard,在另一個Module中導入InboxComponent,我導入App Module – user3642173

+0

的EmailsModule是'this.authService.setUser(authState);'工作嗎?如果將此行替換爲'this.authService.user = authState;'會發生什麼? – Sasxa

回答

0

我終於解決了這一點。我在我的app.component.ts文件中調用了我的DataService以在我的導航中獲取一些數據。這被加載到路由器模塊之外,因此在調用AuthService之前被調用。在AuthGuard被調用之前,這反過來導致DataService。