在 angular 中将来自 valuechanges 和 statuschanges 反应形式的 observables 与 rxjs 结合起来

Combine observables from valuechanges and statuschanges reactive form with rxjs in angular

我正在尝试将 valueChangesstatusChanges 合并到一个订阅中,因为我想在这两个变化中的任何一个发生变化时做一些逻辑。

我正在尝试使用 combineLatest,一旦其中一个可观察对象获得更新,它就会触发。我遇到的问题是 rxjs 警告我 valueChangesstatusChanges 不可订阅。

this.control 是一个 angular FormControl

我正在使用 "rxjs": "^6.3.3"

这是我在控制台中收到的错误消息。

TypeError: You provided an invalid object where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
    at subscribeTo (subscribeTo.js:41)
    at subscribeToResult (subscribeToResult.js:11)
    at CombineLatestSubscriber.push.../angular-shared-lib/node_modules/rxjs/_esm5/internal/observable/combineLatest.js.CombineLatestSubscriber._complete (combineLatest.js:62)
    at CombineLatestSubscriber.push.../angular-shared-lib/node_modules/rxjs/_esm5/internal/Subscriber.js.Subscriber.complete (Subscriber.js:66)
    at Observable._subscribe (subscribeToArray.js:8)
    at Observable.push.../angular-shared-lib/node_modules/rxjs/_esm5/internal/Observable.js.Observable._trySubscribe (Observable.js:43)
    at Observable.push.../angular-shared-lib/node_modules/rxjs/_esm5/internal/Observable.js.Observable.subscribe (Observable.js:29)
    at CombineLatestOperator.push.../angular-shared-lib/node_modules/rxjs/_esm5/internal/observable/combineLatest.js.CombineLatestOperator.call (combineLatest.js:32)
    at Observable.push.../angular-shared-lib/node_modules/rxjs/_esm5/internal/Observable.js.Observable.subscribe (Observable.js:24)
    at FormErrorComponent.push.../angular-shared-lib/dist/fesm5/mymodule.js.FormErrorComponent.ngOnInit (mymodule.js:738)
    at checkAndUpdateDirectiveInline (core.js:22099)
    at checkAndUpdateNodeInline (core.js:23363)
    at checkAndUpdateNode (core.js:23325)
    at debugCheckAndUpdateNode (core.js:23959)
    at debugCheckDirectivesFn (core.js:23919)

这是我当前使用的代码:

import { combineLatest, Subscription } from 'rxjs';

@Input() control: AbstractControl = new FormControl();

combineLatest(
  this.control.valueChanges.pipe(startWith(null)),
  this.control.statusChanges.pipe(startWith(null)),
).subscribe(() => {
  if (!this.control.valid) {
    this.setErrors();
  } else {
    this.showErrors = false;
  }
})

我也尝试过不使用 startWith 管道,尝试将它们放在一个数组中,我尝试了很多但不断收到 You provided an invalid object 消息。有谁知道为什么 rxjs 不能订阅这些 angular observables?以及如何让它发挥作用?当然,我可以轻松地再次订阅并解决我的问题。但我想把它清理干净,但我很困惑为什么这不起作用。

看来你不需要 combine latest。
也许尝试合并?

merge(
  this.control.valueChanges,
  this.control.statusChanges
).subscribe(_ => {
  if (!this.control.valid) {
    this.setErrors();
  } else {
    this.showErrors = false;
  }
});

正如我在对您的问题的评论中提到的,我认为错误的 observable 来自父组件(并且正是来自您传递给 control 输入的值),这会在运行时导致此错误。

我在这个工作 stackBiltz 上复制了相同的用例,它没有任何问题。

@Input() control: AbstractControl = new FormControl();

ngOnInit() {
  combineLatest([
    this.control.valueChanges,
    this.control.statusChanges
  ]).subscribe(() => {
    if (this.control.valid) {
      console.log('SUCESS');
    } else {
      console.log('ERROR');
    }
  });
}