2017-03-24 1 views
0

私はこのような件名サービスを持っています。角2は、タブの変更と再訪問後にサブスクライブします

private subject = new Subject<any>(); 

sendMessage(message: any) { 
    this.subject.next(message); 
} 

clearMessage() { 
    this.subject.next(); 
} 

getMessage(): Observable<any> { 
    return this.subject.asObservable(); 
} 

そして、親コンポーネントからのメッセージを送り

注:私の親と子のコンポーネントは、その後router-outlet

private getMerchantDetail() { 
let data = { 
    Id: this.merchantId, 
} 
this.merchantsService.getMerchants(data) 
    .then((res) => { 
    // console.log(res) 
    if (res.Success) { 
     this.merchant = res.Data[0]; 
     this.merchantListDetailService.sendMessage(res.Data[0]); -> here 
    } 
    }) 
    .catch((err) => { }) 
} 

そして、すべての子コンポーネントからのデータをサブスクライブ介して接続されました。

ngOnInit() { 
    this.merchantSubscribe = this.merchantListDetailService.getMessage() 
     .subscribe(merchant => { 
     console.log(merchant) 
     this.merchant = merchant; 
     this.getMerchantPaymentChannels(); 
     }) 
    } 

    ngOnDestroy() { 
    this.merchantSubscribe.unsubscribe(); 
    } 

問題:子コンポーネントの1が最初にリロードページに開かれたとき すべてが良いです。しかし、子コンポーネントのタブを変更して、最初に開いた子コンポーネントをもう一度見直しても、サブスクライブされたデータは取得されません。しかし、ngOnInit機能が再び機能します。また、getMessage() in serviceも機能します。子コンポーネントのsubscribeコールバックのみがデータを再度取得しません。

答えて

0

私はあなたが同様のサービスでのgetMessageを呼び出して、あなたの子コンポーネント内の機能が必要になると思いますか、これはややあなたが@Inputデコレータ

1

を経由して親コンポーネントからもらったメッセージやデータを渡す必要があります私は同じ問題に出くわしました。私がこれを解決するためにしたのは、Subjectの代わりにBehaviorSubjectを使用することでした。私の理解は、BehaviorSubjectは以前に設定された値を "記憶"しますが、Subjectはそうしないということです。

サブジェクトを購読すると、それは変更をリスンするだけですが、何もない場合は何も起こりません。親がSubjectの次の値を設定すると、メッセージは送信されますが、送信された情報は保持されません。そしてあなたはタブを使っているだけなので、その親はそれを一度だけ送信しています。それだけです。あなたの子供は最初の "変更"を取得しますが、タブを変更すると親のために何も変わらないので、別のメッセージを送信しません。

BehaviorSubjectのSubjectからBehaviorSubjectに行ったときに唯一実際に行っていた違いがBehaviorSubjectの初期値に設定されていることを誤解している可能性があります。

private subject = new BehaviorSubjectSubject<any>(''); 

sendMessage(message: any) { 
    this.subject.next(message); 
} 

clearMessage() { 
    this.subject.next(''); 
} 

getMessage(): BehaviorSubject<any> { 
    return this.subject; 
} 

また、戻り値の型をBehaviorSubjectに変更し、asObservableを削除しました。

子供が初期化されると、それは空白の値(または最初のBehaviorSubjectを設定するもの)になりますが、親が次の値を設定すると、変更を受け取り、そのBehaviorSubjectも値を保持します。したがって、タブを変更した場合でも、何度もその値に戻ることになります。

このようにやって来ることになるのではないかと私は分かりますが、今は私のためにうまくいっているようです。私はそれが変わるか、もっと良い方法を見つけたら更新します。

関連する問題