可观察到的valueChanges似乎是在订阅之前订阅数据

罗希特

我正在创建一个动态创建的反应形式。我从服务中以可观察的形式(来自主题)获取数据,并希望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方法订阅formDataObservable,并为每个发出的值调用其回调。但是,您还在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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

最终可观察到订阅

淘汰赛可观察到多个订阅

rxjs何时可观察到的订阅同步执行?

如何从订阅中返回可观察到的

Redux上可观察到的理想商店订阅

删除可观察到的操作,因为订阅已取消

订阅Angular 8中可观察到组件的问题

可观察到的错误消息-无法捕获订阅

是否可以重新订阅可观察到的Retrofit 2?

从订阅中观察到

switchMapTo在订阅之前创建可观察的

角度可观察到仅使用页面上的多个组件更新其父订阅者

可观察到的Redux:操作完成后组件如何订阅以做出反应?

返回的行为主题(可观察到)是受take(1)还是取消订阅影响?

如何取消订阅或处理Angular2或RxJS中可观察到的间隔?

将“订阅时”回调附加到可观察到的

使用forEach代替可观察到键盘输入事件的订阅有好处吗?

可观察到,在ngOnDestroy中取消订阅无法正常工作

RxJava:为什么订阅共享的可观察到的更改会发出项目

映射可观察到可完成时不调用RxJava2订阅

如何最好地处理模板上可观察到的多个订阅?

Angular4可观察到的ServiceStack Server事件订阅

Angular2可观察到的问题,无法读取未定义的属性“订阅”

Rx.js可观察到的订阅-未捕获按钮单击

获取可观察到的返回值,而无需订阅调用类

淘汰赛绑定包装器,输入更改不会触发可观察到的订阅

订阅患者可观察到的过敏反应后,为什么会收到以下错误?

从组件订阅一个可观察到的两次无效

RxSwift)订阅了一个可观察到的两次无法正常工作