2016-05-20 8 views
1

私は、ユーザーを取得して権限を確認するために作成したサービスを持っています。私のアプリでそれを使用すると、私はアプリ全体に持続したい値がgetUser()メソッドを呼び出すたびにリセットされているように見えます。角2サービスの値が維持されない

マイサービスコードは、このようにある:

import { Injectable } from '@angular/core'; 
import { MyHttp } from '../my-http/my-http.service'; 
import { Response } from '@angular/http'; 
import { MyAuth } from '../my-auth.service'; 
import { MyAuthUser } from './my-auth-user.ts'; 
import { Observable } from 'rxjs'; 

@Injectable() 
export class MyUserService { 
    private currUser: MyAuthUser = { 
     id: 'UNAUTHENTICATED_USER', 
     name:'Anonymous', 
     roles: [] 
    }; 

    constructor(private http: MyHttp, private auth: MyAuth) {} 

    public extractData(res: Response): MyAuthUser { 
     let user = res.json(); 
     this.currUser = Object.assign({}, user) 
     return this.currUser; 
    } 

    public getUser(): Observable<MyAuthUser> { 
     // Check if we already have user 
     if(this.currUser.id === 'UNAUTHENTICATED_USER') { 
      // Get user from tokeninfo endpoint 
      return this.http.get('/myuserendpoint') 
       .map(this.extractData); 
     } 
     else { 
      // Either user is unauthenticated or user already exists, either way send back whatever is in this.currUser 
      return Observable.create((observer:any) => { 
       observer.next(this.currUser); 
       observer.complete(); 
      }); 
     } 
    } 

    public hasRole(role: string): boolean { 
     if(!this.currUser || this.currUser.id === 'UNAUTHENTICATED_USER') { 
      throw new Error('User roles is undefined, make sure you call getUser'); 
     } 

     return !!~this.currUser.roles.indexOf(role); 
    } 
} 

私は私のアプリのブートストラップ法でプロバイダとして、それを追加している:

bootstrap(MyAppComponent, [MyUser, ...]); 

その後、私は得るために、私のルートコンポーネントでそれを使用していますユーザーが特定の役割を持っているかどうかを確認します。

constructor(private userService: MyUser) { 
    this.userService.getUser().subscribe((user) => { 
     this.user = user; 
     let isDeveloper = this.userService.hasRole('developer'); 
     console.log('IS DEV?: ', isDeveloper); 
    }); 
} 

this.userに設定しますが、hasRole()メソッドを実行すると、サービスのcurrUserの値を確認するだけで、何とかUNAUTHENTICATED_USERにリセットされます。私は、この値が、あるメソッド呼び出しから次のメソッド呼び出しまで持続しない理由を理解できません。

私は観察可能なものに精通しているわけではないので、私がそこでやっていることが何かを乱しているかどうかは分かりません。

+0

ここで、 'currUser'が' UNAUTHENTICATED_USER'を返すコード行はどこですか? –

+0

問題は、 'if'ステートメントが' hasRole() 'で実行されるとき、私のhttpリクエストから返されたユーザーとして設定されているにもかかわらず、' this.currUser.id'が再び 'UNAUTHENTICATED_USER'に等しいことです。 – John

答えて

2

渡された方法はthis'

.map(this.extractData); 

利用代わり

.map(() => this.extractData()) 

`を参照している場合、またはそれがパラメータ

.map((x) => this.extractData(x)) 
に受け入れるために必要がある場合は、この方法は、トラブルの原因となるメソッド参照を渡します

このようにしてthisのスコープが保持されます。

+0

ああそうです、ありがとう!私は完全にそれを逃した、答えのためにそんなにありがとう! – John

関連する問題