Skip to main content
 首页 » 编程设计

angular中FormGroup 上的 ValueChanges 在 KeyUp 和 onBlur 上触发

2026年04月21日57sxdcgaq8080

如果表单有效,我的响应式(Reactive) Angular 表单应在 Key Up 上提交。

我在valueChanges上注册了一个订阅者,但它被称为每个输入的onKeyUp和onBlur,并且表单提交了两次。这似乎是一个已知问题 ( https://github.com/angular/angular/issues/12540 ),建议使用 distinctUntilChanged 作为解决方案。 不幸的是,这似乎不适用于我的情况。无论我设置什么时间,提交都会立即触发,并且仍然触发两次。

this.myFormGroup.valueChanges 
  .pipe(debounceTime(2000), distinctUntilChanged()) 
  .subscribe(() => { 
    if (this.myFormGroup.valid) { 
      this.submitForm(); 
    } 
  }); 

有人知道我的 distinctUntilChanged 可能会犯什么错误吗?或者是否有另一种方法可以防止 valueChanges 在 KeyUp 和 onBlur 上触发?

请您参考如下方法:

distinctUntilChanged 默认使用 === 比较,对象引用必须匹配,myFormGroup 会在每次更改时发出一个对象,并且这些对象不是同一个引用

尝试添加自定义方法来处理更改

distinctUntilChanged((p: any, n: any) => JSON.stringify(p) === JSON.stringify(n)) 

stackblitz demo

distinctUntilChanged