2017-11-29 1 views
1

私はRxjsでかなり新しいです。どのように私はこのようになりますカスタム選択ボックスモデルからBehaviorSubjectの最初の値を設定することができます。BehaviorSubjectの最初の値をAngularで設定します。

 private mainRangeDate: any = {beginDate: {year: 2018, month: 10, day: 9}, 
             endDate: {year: 2018, month: 10, day: 19}}; 

     constructor(public daterangeService: DaterangeService) { } 

     ngOnInit() { 
      console.log(this.mainRangeDate); 
     } 

     onDateRangeChanged(event: IMyDateRangeModel) { 
      this.daterangeService.dateRangeInterval.next(event); 
      console.log(event.beginDate); 
     } 

サービス:

@Injectable() 
export class DaterangeService { 

    dateRangeInterval = new BehaviorSubject<Object>({}); 

    constructor() { } 

} 

コンポーネントテンプレート:私は必要

<my-date-range-picker name="mydaterange" [options]="myDateRangePickerOptions" 
           [(ngModel)]="mainRangeDate" (dateRangeChanged)="onDateRangeChanged($event)" required></my-date-range-picker> 

BehaviorSubjectmainRangeDateに設定するには、ngOnInitにするか、タイムアウトを使用したくありません。

+0

なぜngOnInitに設定したくないのですか? –

+0

他のコンポーネントで 'daterangeService.dateRangeInterval'を使う必要があります。私はこの日付間隔に基づいて注文の表を表示しています。それは価値がないなら何も起こらないでしょう。どちらのonInitが最初になるのですか?それは理にかなっていますか? –

+1

この場合、このサービスを使用する最初のコンポーネントのngOnInitからこの値を設定できます。どのコンポーネントが最初にそれを使用するかわからない場合は、ルートコンポーネントから設定してください。 –

答えて

2

値がバックエンドから非同期的に取得され、サービスインジェクションに初期値が存在すると予想されるコンポーネントがサービスを使用することを考慮すると、これらのコンポーネントがインスタンス化される前に初期値を取得して割り当てる必要があります。

これを行うにはいくつかの方法がありますが、その1つはアプリケーションの仕組みによっては優先することができます。 APP_INITIALIZERプロバイダはアプリケーションの初期化を延期できます。ルートリゾルバは、ルートコンポーネントの初期化を延期できます。 ngIfディレクティブは、初期値の準備が整うまでコンポーネントのコンパイルを延期できます。

関連する問題