我正在创建一个动态创建的反应形式。我从服务中以可观察的形式(来自主题)获取数据,并希望valueChanges
在创建表单后订阅它。当我第一次设置它时,我订阅了每个服务的可观察对象和valueChanges,但是我看到了表单创建每个步骤中的数据,这很有意义,因为这两个服务可观察对象可以在此之后发出。
因此,我将设置重构为使用Observable.zip
,据我所知,它使代码线性化,因此应该在valueChanges
订阅之前设置表单,但是我仍然看到表单创建的每个步骤都在进行。
this.filterForm = this.formBuilder.group({
'search': '',
'types': this.formBuilder.group({}),
'dates': this.formBuilder.array([]),
});
let formData = Observable.zip(
this.eventService.getTypes(),
this.eventService.getDates()
);
formData.forEach(data => {
let types = data[0],
dates = data[1];
types.forEach(type => {
this.types.push(type);
(<FormGroup>(this.filterForm.get('types'))).addControl(type, new FormControl())
});
dates.forEach(date => {
this.dates.push(date.format('dddd'));
(<FormArray>(this.filterForm.get('dates'))).push(new FormControl(false))
});
this.filterForm.valueChanges.subscribe(data => console.log(data));
});
当我说在表单建立过程中看到值时,我的意思是:
{search: "", types: {…}, dates: Array(0)}
{search: "", types: {…}, dates: Array(1)}
{search: "", types: {…}, dates: Array(2)}
{search: "", types: {…}, dates: Array(3)}
{search: "", types: {…}, dates: Array(4)}
{search: "", types: {…}, dates: Array(5)}
在创建types字段之前,有十几个条目。
这是应该如何工作的吗?我的目标是在构建表单后进行订阅,因此我仅在用户更改表单时才获取值。
我有一点不同的建议。在从开RxJSsubscribe()
订阅了链条也有方法toPromise()
和forEach()
在内部订阅为好。参见https://github.com/ReactiveX/rxjs/blob/master/src/internal/Observable.ts#L223
我认为这就是您正在发生的事情。该forEach
方法订阅formData
Observable,并为每个发出的值调用其回调。但是,您还在this.filterForm.valueChanges.subscribe
回调内部使用它,这意味着您每次formData
发出一个值时都在创建一个新的订阅。
我不知道您的代码应该做什么,但我认为您可以将其重组为以下内容:
Observable.zip(
this.eventService.getTypes(),
this.eventService.getDates()
)
.do(data => {
let types = data[0],
dates = data[1];
types.forEach(type => {
this.types.push(type);
(<FormGroup>(this.filterForm.get('types'))).addControl(type, new FormControl())
});
dates.forEach(date => {
this.dates.push(date.format('dddd'));
(<FormArray>(this.filterForm.get('dates'))).push(new FormControl(false))
});
})
.switchMap(() => this.filterForm.valueChanges))
.subscribe(data => console.log(data));
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句