【问题标题】:Angular reactive form not submitting selected option values角度反应形式未提交选定的选项值
【发布时间】:2020-06-15 20:31:21
【问题描述】:

我有以下表单,其中包含多个选择输入

<form [formGroup]="searchForm" (ngSubmit)="onSubmit(searchForm.value)">
   <div class="col-md-2" *ngFor="let filter of this.filters; index as i">
      <div class="form-group">
        <select formArrayName="filters" size="5" class="form-control" (change)="onSelectChange($event)">
          <option [ngValue]="null" value="-1" disabled class="first-option-item">{{ filter.name }}</option>
          <option
            *ngFor="let filterValue of this.filterValues[i].items"
            [ngValue]="filterValue">
              {{ filterValue.name }}
          </option>
        </select>
      </div>
    </div>
</form>

反应式初始化:

this.searchForm = this.formBuilder.group({
  searchString: ['', Validators.required],
  filters: this.formBuilder.array([ ])
});

但是,当我提交表单时,过滤器数组上没有任何值

此外,当我在我的(更改)方法上记录 e.target.value 时,我只得到选定的选项值。我想访问完整的对象,即{ id: 1, name: 'first_filter' }。我不需要完整的对象,以便我可以以某种方式将它返回给 FormGroup 吗?

【问题讨论】:

  • 您能说明过滤器是如何添加的吗
  • this.preferencesService.getAllFilters().subscribe((res: any) => { this.filters = res.filters; this.filterValues = res.filter_items;})

标签: arrays angular select angular-reactive-forms option


【解决方案1】:

你的问题

您正在表单中构建一个选择数组。提交表单时,未设置选择值。

设计

绑定到表单数组时,将数组绑定到formArrayName,并将数组中的每个控件绑定到[formControlName]="i"。

解决办法

将formArrayName="filters" 移动到更高的级别,并将[formControlName]="i" 添加到选择中。这会将ith 选择绑定到表单数组中的ith 控件。

我还修改了您的 [ngValue]="filterValue" 以在我的示例中使用 filterValue.name。

<form [formGroup]="searchForm" (ngSubmit)="onSubmit()">
  <div class="col-md-2" *ngFor="let filter of this.filters; index as i"
    formArrayName="filters">
    <div class="form-group">
      <select [formControlName]="i" size="5" class="form-control" (change)="onSelectChange($event)">
        <option [ngValue]="null" value="-1" disabled class="first-option-item">{{ filter.name }}</option>
        <option
          *ngFor="let filterValue of this.filterValues[i].items"
          [ngValue]="filterValue.name">
            {{ filterValue.name }}
        </option>
      </select>
    </div>
  </div>
  <button>Submit</button>
</form>

演示:https://stackblitz.com/edit/angular-i3njdo

【讨论】:

  • 我的过滤器列表是从外部服务器加载的,所以当我将一个空的 formBuilder 控件推送到 filtersFormArray 时,我收到错误无法读取未定义的属性“推送”。我希望提交的对象包含所有输入字段以及一组选定的过滤器。这种方法是否有助于我实现这一目标?
  • 这听起来像是您如何构建表单而不是如何绑定它的问题。如果您正在构建基于一组请求的表单,我建议您等到响应返回后再构建表单。我已经更新了我的 stackblitz 来模拟这个。注意 - 这不是一个完整的解决方案 - 我只是在演示您使用的技术。
  • 我在收到响应后尝试设置 formBuilder 组,但收到错误消息“SearchComponent.html:3 ERROR Error: formGroup requires a FormGroup instance。请传递一个。'
  • 请注意,我已将 *ngIf="searchForm" 添加到我的堆栈闪电战中。您只能在创建后绑定到表单组
  • 谢谢!它确实有效。提交数据时是否可以只获取选中的选项值对象?目前我得到了所有的选项,不管选择的状态。我认为它与初始化 formBuilder 之前的this.filtersFormArray = this.formBuilder.array(this.filters); 有关?
猜你喜欢
  • 1970-01-01
  • 2023-02-03
  • 1970-01-01
  • 2020-05-19
  • 2022-01-03
  • 2018-11-17
  • 2014-11-10
  • 1970-01-01
  • 2020-07-08
相关资源
最近更新 更多