Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 以角度设置BehaviorSubject的第一个值_Angular_Typescript_Rxjs - Fatal编程技术网

Angular 以角度设置BehaviorSubject的第一个值

Angular 以角度设置BehaviorSubject的第一个值,angular,typescript,rxjs,Angular,Typescript,Rxjs,我对Rxjs很陌生。如何从如下所示的自定义选择框模型中设置BehaviorSubject的第一个值: private mainRangeDate: any = {beginDate: {year: 2018, month: 10, day: 9}, endDate: {year: 2018, month: 10, day: 19}}; constructor(public dateran

我对Rxjs很陌生。如何从如下所示的自定义选择框模型中设置
BehaviorSubject
的第一个值:

        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() { }

}
@Injectable()
导出类日期范围服务{
dateRangeInterval=新行为主体({});
构造函数(){}
}
组件模板:

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


我需要将
BehaviorSubject
设置为
mainRangeDate
,但我不想将其设置为
ngonit
或使用超时。

考虑到从后端异步检索值,并且服务由期望初始值存在于服务注入中的组件使用,在实例化这些组件之前,应该检索并分配初始值


有几种方法可以做到这一点,根据应用程序的工作方式,可以选择其中一种<代码>应用程序初始化器提供程序允许推迟应用程序初始化。路由解析程序允许延迟路由组件的初始化
ngIf
指令允许推迟组件编译,直到初始值准备就绪。

为什么不希望在ngOnInit上设置它?在这种情况下,您可以从将使用此服务的第一个组件的ngOnInit设置此值。如果您不确定首先哪个组件将使用它,那么只需从根组件设置它。您能否提供一个工作示例,说明它应该如何整体工作?如果initial
mainRangeDate
是某个硬编码值,则应在服务中定义,而不是在组件中定义。如果初始值是动态的且始终基于select,则不需要Behavior Subject。您可以通过执行以下操作使从daterange获取数据等待有效值成为可观察的:
daterangeService.dateRangeInterval.filter(x=>x!=null)。switchMap(()=>getYourData()).subscribe((数据)=>{})
。只需使用null或您可以识别为无效的东西初始化行为主体。那么您可能有XY问题。依赖DaterangeService的组件不应在请求完成之前实例化。这是一个常见的问题,通常使用APP_初始值设定项、路由解析程序或ngIf防护(取决于“登录”的执行方式)来解决。