2017-05-24 5 views
1

観測値から条件付きで値を放出する方法はありますか?私の場合、.asObservable()関数のサブスクライバは、CurrentUserが初期化された後の最初の値しか取得しません。観測可能 - 条件付きで放出を開始します

export class CurrentUser { 

    private currentUser$: Observable<CurrentUser>; 
    private currentUserBehaviorSubject: BehaviorSubject<CurrentUser>; 

    public name: string = ""; 

    constructor() { 
     this.currentUserBehaviorSubject = new BehaviorSubject(this); 
     this.currentUser$ = this.currentUserBehaviorSubject.asObservable(); 
    } 

    public asObservable(): Observable<CurrentUser> { 
     // 
     if(user.name.length > 0){ 
      return this.currentUser$; 
     } 
     else { 
      // ????? 
     } 
    } 

    public initialize(string name){ 
     this.name = name; 
     this.currentUserBehaviorSubject.next(this); 
    } 
} 

export class SampleComponent { 
    constructor(
     currentUser: CurrentUser 
    ) { 
     currentUser.asObservable().subscribe(
      (u: CurrentUser) => { 
       // i only want an INITIALIZED user here 
      }, 
      error => {}, 
      () => { } 
     ); 
    } 
} 
+0

サンプルコンポーネントを初期化するユーザー –

答えて

3

それはあなたがあなたのasObservable()方法で常に観測を返すことができますように見えるだけcurrentUserBehaviorSubject発する(私はそれはあなたがあるCurrentUserが初期化されたノウハウだと思う)までskipUntil()演算子を使用して排出量を抑制する:

public asObservable(): Observable<CurrentUser> { 
    return this.currentUser$ 
     .skipUntil(this.currentUserBehaviorSubject); 
} 
0
ただ observable Pに加入

export class CurrentUser { 
    subject: Subject<CurrentUser> = new Subject<CurrentUser>(); 
    observable: Observable<CurrentUser = this.subject.asObservable(); 

    constructor() { 
     // Do your business 
     this.subject.next(this); 
    } 
} 

そして、あなたのコンポーネントでは、私がいることがわかりどのよう

ルパンティ

この方法では、新しいCurrentUserを初期化すると、オブザーバーに通知されます。あなたが欲しいものなのですか、それとも私は誤解しましたか?

関連する問題