使用 FormGroup Angular 为每个用户输入创建一个动态键 8

Create a dynamic key per user Input using FormGroup Angular 8

我有一个表格如下:

下拉列表中包含某些预定义的字符串值。 Sensor's MAC Address 输入字段有一个模式检查正则表达式。

目标

我想创建一个对象如下:

{
  'MAC_1': 'location2',
  'MAC_2': 'location3'
}

其中 MAC 由用户输入,location 来自下拉列表。

基于 可以使用 patchValue 插入值,但在示例中它仅 修补 现有键的值。

如何使用 Angular 表单实现此目的?

我已经按照 Medium.com Blog on Angular-in-Depth 创建响应式表单。

代码片段

export class TestComponent implements OnInit {
    dynamicForm: FormGroup;

    macPattern = '^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$';

    constructor(private formBuilder: FormBuilder) { }

    ngOnInit() {
        this.dynamicForm = this.formBuilder.group({
            filters: this.formBuilder.array([])
          });
        this.addFilterToFiltersFormArray();
     }


    createFilterGroup() {
        return this.formBuilder.group({
          mac: new FormControl('', Validators.pattern(this.macPattern)),
          loc: []
        });
    }

    get filtersFormArray() {
        return (this.dynamicForm.get('filters') as FormArray);
    }

    addFilterToFiltersFormArray() {
        this.filtersFormArray.push(this.createFilterGroup());
    }

    removeFilterFromFiltersFormArray(index) {
        this.filtersFormArray.removeAt(index);
    }

    getFilterGroupAtIndex(index) {
        return (this.filtersFormArray.at(index) as FormGroup);
    }

    save() {
        console.log(this.dynamicForm.value);
    }
}

结果如下:

{
  filters: [
     {
       mac: AA:BB:CC:DD:EE:FF,
       loc: location_1
     }
  ]
}

示例数据

[
  filters: 
   {
        {
        mac: 'AA:BB:CC:11:22:DD',
        loc: 'urn:epc:iot:Business.1'
        },
        {
        mac: 'AB:23:24:C3:31:23',
        loc: 'urn:epc:iot:Business.3'
        }
  }
]

您只需要将结果映射到一个对象。但是 Reactive Form 会给你一个数组。所以只需编写一个映射函数即可。

在这里,试一试:

const formData = {
  filters: [{
      mac: 'AA: BB: CC: DD: EE: FF',
      loc: 'location_1'
    },
    {
      mac: 'AB:23:24:C3:31:23',
      loc: 'urn:epc:iot:Business.3'
    }
  ]
};

const desiredData = {};
formData.filters.forEach(filter => {
  desiredData[filter.mac] = filter.loc;
})

console.log(desiredData);