如何以角度反应形式设置对象键值

时间:2020-09-07 09:03:15

标签: javascript html angular angular-forms

我有一个这样的对象。

types: {
  2: {
     zoom: true,
     select: true
  },
  4: {
     zoom: true,
     select: true
  },
}

是否可以从角度形式创建此json对象?

<div formGroupName="types">
    <input type="number" matInput placeholder="Type" [(ngModel)]="searchType" i18n-placeholder>

    <div [ngModelGroup]="searchType">
        <mat-slide-toggle [(ngModel)]="searchType.zoom" color="primary">Zoom</mat-slide-toggle>
        <mat-slide-toggle [(ngModel)]="searchType.select" color="primary">Klik</mat-slide-toggle>
    </div>
</div>

遗憾的是,无法更改json,但是数字需要更改。表单是响应式驱动的,但是我找不到方法,所以我尝试了模板驱动,但是都没有解决。

1 个答案:

答案 0 :(得分:1)

使用角度reactiveFormFactory来构建您的愿望json对象。可以将property动态添加到您的对象。但是您的道具名称不能像您在示例中提到的那样是一些数字。如果您想要某些东西,最好有一个对象数组。

所以,尝试这样的事情:

app.component.ts

import { Component, OnInit } from '@angular/core';
import { FormGroup, FormBuilder, Validators } from '@angular/forms';
import { TypeFactory } from './type.factory.ts';
import { TypeModel } from './app-type.model';

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

export class AppComponent implements OnInit {
  
  typesForm:FormGroup;
  types: TypeModel[] = [];

  constructor(
    private formBuilder: FormBuilder,
    private typeFactory: TypeFactory,
  ){}

  ngOnInit(){
    this.typesForm = this.formBuilder.group({
      id: ['', [Validators.required]],  
      zoom: [''],
      select: ['']
    });
  }

  regForm = () => {
    let newType = this.typeFactory.createTypeDto(this.typesForm.getRawValues());
    this.types = [ ...types, ...newType];
  }
}

app.component.html

<form [formGroup]="typesForm">
  <input formControlName="id" type="number" matInput placeholder="Type" i18n-placeholder>
  <div class="container">
    <mat-slide-toggle formControlName="zoom"  color="primary">Zoom</mat-slide-toggle>
    <mat-slide-toggle formControlName="select"  color="primary">Klik</mat-slide-toggle>
  </div>
  <button class="btn btn-success" (click)="regForm()">Register</button>
</form>

app-type.model.ts

export class TypeModel {
  id: number;
  zoom: boolean;
  select: boolean;
}

app.factory.ts

import { TypeModel } from './app-type.model';

export class TypeFactory {
  createTypeDto(
    form: any,
  ): TypeModel {
    const model = new TypeModel();
    model.id = form.id;
    model.zoom = form.zoom;
    model.select = form.select;

    return model;
  }

}
相关问题