为什么在此FormArray中无法编辑mat-form-field?

斯蒂芬·福克

下面的表格几乎可以完成它应该做的事情,除了我不能编辑其中的任何mat-form-field内容。它们没有被禁用,只是无法编辑。

是什么原因呢?

请参阅:StackBlitz

在StackBlitz上看不到这个示例的不同之处。

import {Component} from '@angular/core';
import {FormBuilder, FormGroup, FormArray, FormControl} from '@angular/forms';

@Component({
  selector: 'form-field-label-example',
  templateUrl: 'form-field-label-example.html',
  styleUrls: ['form-field-label-example.css'],
})
export class FormFieldLabelExample {

  public dataList = [
    {name: 'Alice'},
    {name: 'Bob'}
  ]

  public form: FormGroup;

  constructor(private _fb: FormBuilder) {

    const formArray = this._fb.array([]);  

    for (const data of this.dataList) {
      formArray.push(
        this._fb.group({name: new FormControl(data.name)})
      );      
    }

    this.form = this._fb.group({
      offers: formArray
    });

  }

}
<div>

  <form [formGroup]="form">

    <div formArrayName="offers" *ngFor="let data of form.controls.offers?.value; let i = index;">
      <ng-container [formGroupName]="i">
        <mat-form-field>
          <input matInput placeholder="Name" formControlName="name">
        </mat-form-field>
      </ng-container>
    </div>

  </form>

  <span *ngIf="form.dirty">DIRTY</span>

  <mat-form-field>
    <input matInput placeholder="Name">
  </mat-form-field>

</div>
yurzui

它确实与ngFor渲染行为有关。

更精确地说,如果ngFor中使用的数组更改了对该数组元素的引用(并且我们没有提供自定义的trackBy函数来覆盖比较),则Angular将识别这些更改并重新呈现视图。 在此处输入图片说明

角形式通常可以触发AbstractControl.updateValueAndValidity所有控件层次的方法。

FormControl -> parent -> FormGroup -> parent -> FormArray -> parent -> FormGroup

对于FormGroup,它将触发以下方法:

_updateValue(): void { (this as{value: any}).value = this._reduceValue(); }

这基本上会创建一个新对象,即{name: 'Alice'},下次触发该对象时,它将用新对象覆盖当前值。

{name: 'Alice'} !== {name: 'Alice'}

正是这与ngForOf指令中的Angular默认识别不同。

你可能会问?

那为什么我在StackBlitz上看不到这个示例的不同之处?

在该示例中,问题仍然存在,但乍看之下看不到。

|username  password
  /\
click here(it works)

username  password
            /\
     then click here(it doesn't since the dom was rerendered)

您的示例与上面的示例之间的区别在于,您使用了材质控件,并且触发的AbstractControl.updateValueAndValidity发生较早。

那么解决方案是什么?

1)之前提到的trackBy属性

trackByFn(index) {
  return index;
}

*ngFor="let data of form.controls.offers?.value; let i = index; trackBy: trackByFn"

Stackblitz示例

2)分配this.form.controls.offers.value给组件属性并使用它。

arr;
...
this.arr = this.form.controls.offers.value;

*ngFor="let data of arr; let i = index;"

Stackblitz示例

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么 mat-form-field 没有出现?

如何从Mat-form-field中删除Mat-form-field-wrapper?

与mat-form-field中的matSuffix mat-checkbox交互

mat-list-item 重叠中的 mat-form-field

mat-form-field必须包含MatFormFieldControl

为什么在Django中form.as_p显示错误,而form.non_field_errors不显示

在mat-form-field中更改边框颜色

解决错误后,mat-form-field不会删除mat-form-field-invalid类

无法从mat-form-field获取选定的选项以在angular2中动态生成url

如何调整mat-form-field mat-chip的大小?

角度指令-ElementRef-无法从mat-form-field中选择mat-select

“ mat-form-field”和“ mat-input-container”有什么区别

在触摸控件之前显示mat-form-field错误消息

如何基于值禁用角度的mat-form-field?

mat-form-field始终显示所需的红色?

是否可以调整 mat-form-field-outline 的厚度?

mat-form-field必须包含MatFormFieldControl并且已经导入

mat-form-field 占位符文本未对齐

angular - 覆盖 mat-form-field 继承的样式

Angular 12- mat-form-field 超出搜索栏

将拖放添加到 mat-form-field 中的 mat-chip 列表

当我向子mat-chip-list添加新项目时,为什么mat-form-field会增加其高度?

Angular4 mat-form-field textArea 无法启用水平调整大小

Field redux-form 中的道具组件不起作用

引导面板中wtf.form_field周围的边距

提交后未在表单中捕获mat-form-field中的值

如何在Angular Material的mat-form-field中添加文本修饰?

如何在mat-form-field的输入中获取点击事件?

如何删除mat-form-field Angular Material中的[object Object]