2017-06-09 5 views
0

サービスに変数を作成しようとしています。このサービスを挿入するたびにアクセスできます。しかし、BehaviorSubject型の私のlogin$にデータを設定することはできません。私はthisthisをチェックしましたが、どのように動作しているのかを理解するのが難しいです。BehaviorSubject undefined issue

コンポーネント

this.loginService.login = user.value.username; // OK 
this.loginService.pass = user.value.password; // OK 
this.loginService.emitLogin(user.value.username); // UNDEFINED - user.value.username is input field of form group 

LoginService

export class LoginService { 

    public login: string; 
    public pass: string; 
    public login$ = new BehaviorSubject(this.login); 

    emitLogin(value: string) { 
    this.login$.next(value); 
    } 

    constructor(private http: Http) { } 
} 

また、私は私のDriverServicelogin$を使用したいと思います。ここで私が今まで行っているものです:

export class DriverService {  
     private login; 

     constructor(private http: Http, private loginService: LoginService) { 
     this.loginService.login$.subscribe(value => { 
      console.log(value); 
      this.login = value; 
     }); 
     } 
} 

DriverServiceはどのようにして移入し、適切に、そして他のサービスでは、それを使用可能にすることができますか?

おかげ

+1

'this.login'ような何かを...最初は' undefined'です:) '公共ログインしてください:サービス中= '' 文字列を'。 – Alex

答えて

0

BehviorSubjectは常に何らかの値で初期化されますが、あなたのコードの中であなたは、変数の定義と初期化します。

public login: string; 
public login$ = new BehaviorSubject(this.login); 

この

public login$ = new BehaviorSubject(''); 
emitLogin(value: string) { 
    this.login$.next(value); 
    } 
+0

変更を適用しました。今のところ、コンソールでは 'BehaviorSubject ... _value:" Testing "..."というようなもので、 'DriverService'には空文字列があります。その他のアイデアは? – Haseoh

+0

私の控えめなログインとDriverServiceは、BehaviorSubjectの初期値が ''(空の文字列)になるように、同じ時刻に初期化しています。 BehaviorSubjectの最初の値は空であるため、drivieServiceの最初の値は ''になります。 app.loginService.emitLogin(user.value.username)でアプリの初期化が完了しました。呼び出され、正しいが押されます。なぜBehaviorSubjectを使用しているのですか?私はあなたのケースでプレーンなテーマを十分に考えています(https://stackoverflow.com/questions/21257830/how-can-publishsubject-and-behaviorsubject-be-unsubscribed-from) – CharanRoot

+0

私はこれらのサービスはそうではないと思います同時に初期化すると、アプリケーションを初期化するときにまず行う必要があるのはログインプロセスを経てから、 'DriverService'にアクセスできるからです。私はBehaviorSubjectを使用しています。標準のSubject作業を行うことができなかったからです(BehaviorSubjectはうまく動作しません)。 – Haseoh