2016-09-20 5 views
1

Angular 2アプリケーション用のログインサービス(AuthService)を作成しようとしていますが、私は期待していないことを続けています。私が達成しようとしているのは、ログイン後にアプリケーションのどこでも使用される単一のユーザーオブジェクトを持つことです。ユーザがログアウトしてログインした場合、ユーザはngOnInit機能で他のコンポーネントをフェッチして変更する必要があります。Angular2、コンポーネント間でサービス結果を永続化する

class Service { 
    private user: User; 
    constructor(private http: Http) { 

    } 

    login(user, pass) { 
     //login stuff, set this.user; 
    } 

    getUser() { 
     return this.user 
    } 
} 

私は、ブートストラップ、私はその後、いくつかのコンポーネントでそれを使用

const SERVICE_PROVIDERS = [ 
    AuthService 
] 

@NgModule({ 
    bootstrap: [App], 
    providers: [ 
     SERVICE_PROVIDERS 
    ] 
}) 

で、一度サービスを宣言します。ルートの周りの警備員、基本的なユーザーの詳細の表示、またはログインした人の名前をどこかに表示するようなものを考えてください。使い方は次のようにその後、次のとおりです。

export class Login { 
    user: User; 
    constructor(private router: Router, private authService: AuthService) { 

    } 

    ngOnInit() { 
     this.user = this.auth.getUser(); 
    } 
} 

この方法AuthServiceは、すべてのコンポーネントに一度インスタンス化されます。このようにして、ユーザはログアウトしてに戻るときにはを変更しません。だから、私はLoginコンポーネントのサービスオブジェクトでユーザー変数が変更されたことを知っていますが、ngOnInitはそこをナビゲートするときに古いユーザーオブジェクトを引き出します。私のルートの周りの警備員も古いユーザーを使用します。すべてのコンポーネントは、それら全てがuserの独自のインスタンスを持っていることを意味サービス、のそれ自身のインスタンスを持っているように見えます

編集 。ログインしたユーザーが必要なたびにデータベースに戻ってはいけません。

答えて

1

あなたは

class Service { 
    private _user: Subject<User> = new Subject<User>; 
    public get user() : string 
    { 
     return this._user; 
    } 

    constructor(private http: Http) { 

    } 

    login(user, pass) { 
     //login stuff, set this.user; 
     // after setting user call this.user.next(<new user object>); 
    } 
} 

// using user object 
// serviceinstance.user.subscribe(res => { you will get user object here.. }) 

は、この情報がお役に立てば幸い、以下試してください!

+0

'Subject 'はネイティブオブジェクトですか? – choz

+0

件名は ''rxjs/Rx''からインポートされます。これはよりクリーンな方法ですが、私の問題は、すべてのコンポーネントが 'Service'という独自のインスタンスを持っているということです。つまり、すべてが異なる' user'オブジェクトを持っています。 – Jorg

+0

@Jorgさまざまなコンポーネントに異なるサービスを使用するポイントは何ですか?これは意図的なものなのでしょうか、修正する方法がわからないだけなのでしょうか?後者の場合、 '@ NgModule'に"アプリケーション "プロバイダを宣言しないでください。これは場合によっては複数のインスタンスにつながる可能性があります。代わりに、モジュールに静的な 'forRoot'を実装する必要があります。 [こちらをご覧ください](https://angular.io/docs/ts/latest/guide/ngmodule.html#!#core-for-root) –

関連する問題