【问题标题】:Cannot reset reactive form that contains a select无法重置包含选择的反应式表单
【发布时间】:2019-01-03 09:25:45
【问题描述】:

我正在使用角度 6

我的html是

<form [formGroup]="myForm" >
  <label>
    <input type="text" formControlName="name" placeholder="name" required autofocus >
  </label>
  <label>
    <select name="drop" formControlName="drop">
      <option value="developer"selected >developer</option>
      <option value="designer">designer</option>
      <option value="admin">admin</option>
    </select>
  </label>
</form>

即使我在第一次加载页面时在“开发者”option 中设置了selected,但没有选择“开发者”。我猜这是一个角度的小错误,无法正确呈现 html,所以我在定义表单时放入了组件:

  myForm = this.formBuilder.group({
    name:['',Validators.required],
    drop:['developer']
  });

它有效。

真正奇怪的是,当我在另一个按钮内执行this.myForm.reset(); 时,放置在表单之外,“名称”应该是空的,但下拉列表也是完全空的,只是空白,但它应该显示“开发者”,对吧?

那个按钮隐藏了一些元素,应该重置表单,它在表单之外,它确实

  getOtherData(id){
    this.myForm.reset();

这行不通,所以我必须这样做

this.myForm.setValue({
  name: '',
  drop: 'developer'
});

为了实际重置表单。 selectreset 的组合出了什么问题?我想使用一次reset 并完全重置表单,没有“黑客”我该怎么做?

谢谢

【问题讨论】:

  • 因为那是标准的 html 标记

标签: angular forms angular6 angular-reactive-forms


【解决方案1】:

你应该使用补丁方法来重置表单

setValue() 方法来更新所有 FormControl 值。

patchValue() 方法也会从模型中设置 Formcontrol 值,但仅限于我们在模型中提到的那些。

this.myForm.patchValue({
  name: ''
});

如果你想对特定的 FormControl 值使用重置方法

  this.myForm.get('name').reset(); 

示例:https://stackblitz.com/edit/patch-with-form

【讨论】:

  • 是的,但我想问如何在不使用patchValue 解决方案的情况下使用reset
  • 你为什么要那样做。 setValue 和 patchValue 有区别
【解决方案2】:

你可以像这样同时使用reset方法和传递值。 注意:如果您正在验证对象,请始终与 null 进行比较。

 this.form.reset({
    name: '',
    drop: [null]
  });

FormGroup

【讨论】:

    【解决方案3】:

    真正奇怪的是当我做this.myForm.reset();在另一个按钮内,放置在表单之外,"name" 应该是空的,但下拉列表也是完全空的,只是空白,但它应该显示 "developer",对吧?

    不,不应该。当我们调用reset() 时会发生什么?最重要的是,它将所有值设置为null

    在您的选择中,您要选择的字段具有值"developer",因此当然不会设置,因为您刚刚将值重置为null,即

    null === 'developer' // false!  
    

    这是一个 Angular 表单,所以 Angular 并不关心 HTML 属性(在本例中为 selected),但会监听表单控件以及那里发生的事情。所以你需要做的是用你想要的值重置表单,因为你可以在reset上给出值:

    this.myForm.reset({
      name: '',
      drop: 'developer'
    });
    

    【讨论】:

    • 谢谢你,非常有用的 cmets。我认为selected 属性在操作表单时被角度考虑。我的逻辑是“既然考虑了required,那么也考虑了selected”。但既然不是这样,那我就按照你的建议重设表格
    • 我理解这种混淆,但我们在这里看到的值与required 非常不同。如果您将表单控件的初始值设置为“admin”,则相同,但由于它具有selected 属性,所以希望选择“开发者”:) 这让我想到了避免使用required 的旁注也在模板中。设置表单控件所需的所有验证器,这就是我们在表单控件上设置验证器的原因! :) 但是,是的,很高兴我能提供帮助,祝您有美好的一天,愉快的编码! :) :)
    猜你喜欢
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 2018-07-22
    • 2019-06-24
    相关资源
    最近更新 更多