【问题标题】:Reactive forms in Angular: Two-way bindingAngular 中的响应式表单:双向绑定
【发布时间】:2018-06-10 11:24:34
【问题描述】:

我对响应式表单有疑问。当用户更改输入时更新模型类是直截了当的。但我需要做相反的事情:以编程方式更改模型,并查看 HTML 表单中的更改。

简化代码为:

this.user = new User();

然后:

this.form = this.fb.group({
      name: new FormControl(this.user.name, [Validators.required]),
      email: new FormControl(this.user.email, [Validators.required])    
    });

假设它工作正常。如果用户在 GUI 中更新名称,则 this.user.name 正在正确更新。

假设我已经向 User 类添加了一些逻辑,它会根据输入的名称填充电子邮件。每次更改名称时,电子邮件字段都会自动生成为 'name'@gmail.com

很遗憾,生成的电子邮件在 GUI 中不可见。如何做到这一点?

如何通知FormGroup User 类的变化?

我有两个想法:

1) 添加 ([ngModel]) - 它起作用了 - 但我觉得将 Reactive Forms 与 ngModel 混合使用是个坏主意

2) 在表单创建后添加以下代码:

this.form.controls["name"].valueChanges.distinctUntilChanged().subscribe(form => {
    this.form.patchValue({email: this.model.email});
});

但它看起来并不干净。还有其他选择吗?

【问题讨论】:

  • 使用(valueChanged)="someMethod($event)"
  • 订阅中的console.log(this.model.email) 打印什么?
  • 对不起,我的错 - 不是模型,而是 this.user.email :)

标签: javascript angular angular-reactive-forms ngmodel


【解决方案1】:

这不是响应式表单的工作方式。

使用响应式表单,表单不会绑定到您的模型,它有自己的模型,您可以查看“form.value”。

在创建表单控件时传递给表单控件的值没有被绑定,它只是用作表单控件的初始值。

目的是用户填写表单,动态进行验证(即反应部分),然后当他们提交表单时,您将表单的值一次性传递给您的模型。

也就是说,如果要更新表单控件的值,patchValue 确实是正确的方法。

【讨论】:

  • 所以...如果我需要进行模型-> HTML 表单等交互,我应该坚持模板驱动的表单和双向数据绑定?
  • 我想是这样,但我无法想象您“需要”将表单直接绑定到模型的用例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-29
  • 2020-09-12
  • 2017-08-28
相关资源
最近更新 更多