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