更改 Angular formGroup 控件的顺序

问题描述 投票:0回答:5

我正在构建一个 Angular 应用程序,它通过

formgroup object
动态呈现表单,如下所示:

    <div *ngFor="let controlName of updateValuesForm.controls | keys">
      <input [formControlName]=controlName type="text" class="edit-template-input" />
    </div> 

但是在某些情况下,我想在我的 formgroup 对象中交换这些控件中两个的顺序。 Angular

formgroup object
可以吗?

angular angular-forms
5个回答
3
投票

一般来说,Javascript 中的对象没有顺序,而且对它们来说没有顺序。

您可以使用 FormArray,它内部有一个数组来保存控件并以这种方式更改顺序。

或者,如果您真的想用对象来完成此操作,您可能必须将控件存储在数组中并以这种方式更改顺序。


0
投票

A

FormGroup
内部是一个对象,因此没有固有的顺序。

如果您将控件放在

FormArray
中,您将能够使用控件的索引更改控件的顺序。

您可以使用

insert
removeAt
push
等方法通过数组索引相应地操作
FormArray
中控件的顺序。


0
投票

我用了一个不太聪明但有效的方法,把底线放在名字和你想要的顺序的上面

this.formBuilder.group({
   A : ....,
   B : ...
})

更改为

this.formBuilder.group({
   _1_A : ....,
   _2_B : ...
})

0
投票

FormGroup
的控件可以按所需顺序复制。

原订单:

this.form.controls = {
  A: ...,
  Z: ...,
  B: ...
}

所需订单:

this.form.controls = {
  A: this.form.controls.A,
  B: this.form.controls.B,
  Z: this.form.controls.Z
}

在 chrome、firefox 和 safari 中进行了测试。


0
投票

6 年后,

formGroup.controls
的顺序是相关的,因为“高性能反序列化”需要像
$type
这样的元数据字段位于序列化 json 的顶部。

但是

value
返回
formGroup.controls
的顺序。 因此,要对控件进行排序并将所有元数据字段(以
$
开头)放在顶部,您可以执行以下操作:

import { FormGroup } from '@angular/forms';

export function sortFormGroupControls(formGroup: FormGroup): void {
    const controls = { ...formGroup.controls };
    const sortedKeys = Object.keys(controls).sort((a, b) => {
        return a.localeCompare(b);
    });

    Object.keys(controls).forEach(key => {
        formGroup.removeControl(key);
    });

    sortedKeys.forEach(key => {
        formGroup.addControl(key, controls[key]);
    });
}
© www.soinside.com 2019 - 2024. All rights reserved.