带有{emitEvent:false}的patchValue触发Angular 4 formgroup上的valueChanges

lar*_*rpo 18 typescript ionic-framework angular2-formbuilder angular angular-reactive-forms

我有一个formbuilder组,我正在使用valueChanges监听更改并触发一个保存函数,然后在表单上刷新函数:

 this.ticketForm.valueChanges.debounceTime(1000).distinctUntilChanged()
 .subscribe(data => {
   this.saveTicket();
   this.refreshTicket();
 })
Run Code Online (Sandbox Code Playgroud)

然后我重新加载表单并使用patchValue将数据重新分配到表单字段(以及页面上的其他位置,特别是更改日志),例如:

    this.ticketForm.patchValue(ticket, { emitEvent: false });
Run Code Online (Sandbox Code Playgroud)

但是,尽管emitEvent:false,这会导致表单的无限循环保存.

这是一个Angular 4/Ionic 3错误还是我的误解?

Lak*_*hay 16

试着增加onlySelf: true与一起emitEvent: false以这种方式:

this.ticketForm.patchValue(ticket, {emitEvent: false, onlySelf: true});
Run Code Online (Sandbox Code Playgroud)

  • 不确定这是否适用于OP,但对我不起作用 (17认同)
  • 这可能是一个错误。从文档来看,它说 onlySelf 的默认值应该是 true 并且这应该没有效果。无论如何,此处的行为与文档中的预期行为不匹配。 (4认同)

小智 11

由于代表的原因无法发表评论,所以我将其作为@Craig Wayne 的答案发布。

仅当您使用以下方式侦听表单控件上的值更改时,emitEvent:false 才有效:

this.form.valueChanges.controlName.subscribe(val => doSomething(val));
Run Code Online (Sandbox Code Playgroud)

如果您绑定到元素上的模型更改,则无论以下情况都会发出事件:

<input (ngModelChange)="doSomething($event)"/>
Run Code Online (Sandbox Code Playgroud)


kts*_*gop 8

在使用 Angular 9.1.13 时,我也遇到了同样的问题。尝试使用FormControl.setValue、 和FormGroup.patchValueAPI,并在所有可能的组合中使用建议的参数{emitEvent: false, onlySelf: true}。可valueChanges观察到的仍然被触发。

最终唯一对我有用的是:

myForm.disable();
myForm.patchValue({myControl: ''}, {onlySelf: true, emitEvent: false});
myForm.enable();
Run Code Online (Sandbox Code Playgroud)

  • 我的项目是在 Angular 13 上,即使这样也不起作用。 (2认同)
  • @VictorZakharov 请开源! (2认同)