2017-09-18 5 views
1

私はいくつかのデータを取得し、それを表示するためにobervable in inputとして他のコンポーネントに送るために、 "genericC"という一般的なコンポーネントを使用しています。角度@Input変数が観測可能(ライフサイクル)の最新のものではありませんか?

しかし、データを更新する目的でこの汎用コンポーネントにイベントの送信を送信しようとすると、汎用コンポーネントの入力から来るuserId変数がngOnChanges()メソッド。 いつも聞いて、データの更新を待つ観測可能性を使うのは当てはまりません。

たぶん私はこれが私の前のテキストよりも明らかであろうこと、ホッピングでは、私のコードであるアンギュラ

とデータのライフサイクルについて何かを欠場:

Component A, I want to say, go to update the data via this call : this.uiService.refreshFetchNotify("family"); 

Component GENERIC: 
@Input() userId: string; 
@Input() type: string; 

..... constructor and declarations of variable 

this.refreshFetch$ = this.uiService.refreshFetchChanged().startWith(this.type); 

ngOnChanges(changes: SimpleChanges) { 
    // this.userId ===> is up to date as expected 
} 

this.searchTxt$ = this.searchForm.valueChanges 
     .startWith(null) 
     .combineLatest(this.refreshFetch$) // this.userId just after is NOT UP TO DATE yet 
     .switchMap(([_, refresh]) => { 
      if (this.type === 'family' && refresh === this.type) 
       return this.filterFamiliesUser(
       this.userId 
      ); 
      else() { 
       // something else here 
      } 
     }); 

は、事前にありがとうあなたの助け

編集:この例では、私はそれを汎用コンポーネントと呼んでいますが、私のアプリケーションで今のようにアプリケーションを使用していても、私はサービスを使用します。 @入力コンポーネントに依存する

+1

一般的なコンポーネントにビューが添付されておらず、データ更新を行う目的がある場合は、サービスにリファクタリングすることができます – Vega

+0

私はあなたに同意します。ここに述べた問題を避けてください。 私のコンポーネントを保持しなければならない場合、私は答えを知っているでしょう:) –

答えて

0

valueChangesngOnChangesより前にトリガーされます。

イベントvalueChanges(現在は_にマッピングされています)は、最新の値を持つ必要があります。 this.userIdの代わりにそれを使用してください。 Angular docs

名前の変更を表示するには、補間バインディングが便利です。 観測可能なフォームコントロールプロパティを購読することは、コンポーネントクラス内でアプリケーションロジックを起動する の場合に便利です。

補間バインディング(例:this.userId)は、表示パスを対象としています。

valueChangesは、制御パス用です。 2つのパスを組み合わせるべきではありません。

いくつかの最適化されていないソリューションもあります。

  • あなたはthis.userIdを更新し、あなたの観察可能なチェーンにdoを追加することにより、valueChangesパス上のすべてを行うことができます。
  • ngOnChangesパスのすべてを自分の件名を作成し、からvalueChangesに登録しないでnext()に電話すると、すべてを行うことができます。

ただし、最適な解決策は、コントロールパスで値変更イベント自体を使用し、表示専用にthis.userIdを使用することです。

+0

非常に建設的な答えをありがとう。 いくつかの点を明確にするためにお知らせください。 あなたは言っています: '現在_にマッピングされているvalueChangesイベントは、その中に最新の値を持つ必要があります。 this.userIdの代わりにthis.userId'を使用してください 私はそれに同意しません、私は '_は私のsearchTxt(テキストフィルタです)formControlによって与えられると思うが、ここで問題ではない。私の場合、valueChangesは重要ではありません。 BTW:変数 'refresh'には、イベントを発行したときに定義した文字列が含まれていますが、値は重要ではありません。 –

+0

いつでも、私はobservableの中に 'userId'を持っています。なぜなら、私は自分のコンポーネントの@inputしか持っていないからです。 私の例を理解している間違いを理解していると思います。問題が発生したときは、combineLastestがイベントを介して他のコンポーネントから送られてくる新しい値を受け取るためです。 もし私が何かが恋しいと思うなら、この場合は、ごめんなさい。) –

+0

あなたが見ていたフォームコントロールは、 'this.userId'と同じコントロールだと思っていました。 'userId'を入力として取るのではなく、' userId'のために観測可能なソースを入力として取ることができますか? – Pace

関連する問題