javascript - FormArray 的 Angular .removeAt(i) 不会在 DOM 中更新 - Angular

标签 javascript angular typescript angular-reactive-forms

我认为这是我的实现的问题,但似乎我用于创建动态 FormArray 的代码应该是基于 this question 的函数。我提出了。当我将它集成到我的项目中时,remove 函数确实会从 FormArray 中删除元素,但它不会反射(reflect)在界面中/不会从 DOM 中删除对象。这可能是什么原因造成的?

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

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {

  objectProps: any[];

  public dataObject = [{
      "label": "Name",
      "name": "name",
      "type": "text",
      "data": ""
    },
    {
      "label": "Contacts",
      "name": "contacts",
      "type": "inputarray",
      "array": []
    }
  ]
  form: FormGroup;

  constructor(private _fb: FormBuilder) {}

  ngOnInit() {

    const formGroup = {};
    for (let field of this.dataObject) {
      if (field.type == "inputarray") {
        console.log("THIS IS " + field.type)
        formGroup[field.name] = this._fb.array([''])
      } else {
        console.log("THIS IS " + field.type)
        formGroup[field.name] = new FormControl(field.data || '') //, this.mapValidators(field.validation));
      }
    }

    this.form = new FormGroup(formGroup);
  }

  addFormInput(field) {
    const form = new FormControl('');
    ( < FormArray > this.form.controls[field]).push(form);
  }

  removeFormInput(field, i) {
    ( < FormArray > this.form.controls[field]).removeAt(i);
  }
}
<form *ngIf="form" novalidate (ngSubmit)="onSubmit(form.value)" [formGroup]="form">
  <div *ngFor="let field of dataObject">
    <h4>{{field.label}}</h4>
    <div [ngSwitch]="field.type">
      <input *ngSwitchCase="'text'" [formControlName]="field.name" [id]="field.name" [type]="field.type" class="form-control">
      <div *ngSwitchCase="'inputarray'">
        <div formArrayName="{{field.name}}" [id]="field.name">
          <div *ngFor="let item of form.get(field.name).controls; let i = index;" class="array-line">
            <div>
              <input class="form-control" [formControlName]="i" [placeholder]="i">
            </div>
            <div>
              <button id="btn-remove" type="button" class="btn" (click)="removeFormInput(field.name, i)">x</button>
            </div>
          </div>
        </div>
        <div>
          <button id="btn-add" type="button" class="btn" (click)="addFormInput(field.name)">Add</button>
        </div>
      </div>
    </div>
  </div>
  <button type="submit" class="btn btn-danger btn-block" style="float: right; width:180px" [disabled]="!form.valid">Save</button>

最佳答案

这不是一个很好的解决方案,但我通过操纵值和移除控件后解决了我的问题。
我只是将要删除的项目移动到数组的末尾,然后删除了最后一个项目。

removeItem(index: number): void {
  const value = this.formArray.value;

  this.formArray.setValue(
    value.slice(0, index).concat(
      value.slice(index + 1),
    ).concat(value[index]),
  );

  this.formArray.removeAt(value.length - 1);
}
我希望它可以帮助将来在这个问题上苦苦挣扎的人。

关于javascript - FormArray 的 Angular .removeAt(i) 不会在 DOM 中更新 - Angular,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53056007/

相关文章:

javascript - 如何使用Observable进行 Angular 错误处理

javascript - 如何在 ngFor 中使用引用 id ( # ) 并在下一个 NG select 中获得焦点?

typescript - 用于组织长代码的 mixin 或静态方法哪个更好

html - ChartJS "half donut"图表显示不正确

javascript - JQuery .load() 函数不起作用,因为加载的文件包含小 JS

javascript - model.$modelValue 指令中为 NaN

javascript - 对象数组在 AngOninit 中显示未定义 5

Angular "Must be imported or local"错误

javascript - jQuery Filter - 如何设置除 "All"之外的不同事件按钮?

javascript - 为什么 DataTables 方法不适用于表?