我收到以下JSON,其中有一个对象数组,除了要执行分别以angular形式初始化窗体的值的功能外,我还想访问该对象的一些属性以形成FormGroup,但是我不知道怎么做
{
"id_interface": 1,
"id_EquipoOrigen": {
"id_equipo": 47,
"nombre": "C65CAN01",
"localidad": "CAN",
"categoria": "RGUcore"
},
"id_PuertoOrigen": {
"id_puerto": 2088,
"nombre": "Gi5/1",
"ultima_actualizacion": "2019-07-22T08:22:43-04:00"
},
"estatus": true,
"etiqueta_prtg": null,
"grupo": 0,
"if_index": 0,
"bw": 1000,
"bw_al": 1000,
"id_prtg": 0,
"ospf": false,
"description": "C65CAN01-Gi5/1=RPCA_MT_213-Gi0/1",
"id_EquipoDestino": {
"id_equipo": 47,
"nombre": "C65CAN01",
"localidad": "CAN",
"categoria": "RGUcore"
},
"id_PuertoDestino": {
"id_puerto": 1,
"nombre": "N/A",
"ultima_actualizacion": "2019-07-22T08:22:19-04:00"
},
"ultima_actualizacion": "2019-07-22T15:24:06-04:00"
},
我特别想添加ID_EquipoDestino-IdEquipodOrigen的nombre,localidad,origen字段并添加ID_PuertoDestino-IdPuertodOrigen的nombren字段。
我已经编写了一个代码,但是它是使用另一个JSON而不是对象数组接收的,现在我想使其适应于我接收到的对象数组。
InterfaceForm: FormGroup=new FormGroup({
id_interface: new FormControl('',Validators.required),
id_EquipoOrigen:new FormControl('',Validators.required),
EquipoOrigen:new FormControl(null),
PuertoOrigen: new FormControl(null),
id_PuertoOrigen: new FormControl('',Validators.required),
LocalidadOrigen: new FormControl(null),
CategoriaOrigen: new FormControl(null),
estatus: new FormControl(),
etiqueta_prtg:new FormControl(),
grupo: new FormControl(),
if_index:new FormControl(),
bw:new FormControl(),
bw_al:new FormControl(),
id_prtg:new FormControl(),
ospf:new FormControl(),
description:new FormControl(),
id_EquipoDestino:new FormControl('',Validators.required),
EquipoDestino:new FormControl(null),
id_PuertoDestino:new FormControl('',Validators.required),
PuertoDestino:new FormControl(null),
LocalidadDestino:new FormControl(null),
CategoriaDestino:new FormControl(null),
ultima_actualizacion: new FormControl(null),
})
// Funcion que sirve para inicializar el formulario y colocar los campos en blanco.
initializeInterfaceFormGroup() {
this.InterfaceForm.setValue({
id_interface:'',
id_EquipoOrigen:'',
EquipoOrigen:null,
id_PuertoOrigen:'',
LocalidadOrigen:null,
CategoriaOrigen:null,
PuertoOrigen:null,
estatus:'',
etiqueta_prtg:'',
if_index: '0',
grupo:'0',
bw:'0',
bw_al:'0',
id_prtg:'0',
ospf:'true',
description:'',
id_EquipoDestino:'',
EquipoDestino:null,
id_PuertoDestino:'',
PuertoDestino:null,
LocalidadDestino:null,
CategoriaDestino:null,
ultima_actualizacion:null,
});
}
答案 0 :(得分:0)
如评论中所述,您可以使用FormArray
来为Form
生成Array
。
您将把数组中的每个对象映射到FormGroup
。整个数组最终将对应于FormArray
。在这种形式下,您还必须提供从FormArray
添加(.push(...)
)和删除(.removeAt(...)
)项目的规定。
在这里,尝试一下:
import { Component } from '@angular/core';
import { FormGroup, FormArray, FormBuilder } from '@angular/forms';
import { HttpClient } from '@angular/common/http';
import { Interface } from './models/data.model';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
interfacesForm: FormGroup;
constructor(
private http: HttpClient,
private fb: FormBuilder,
) { }
ngOnInit() {
this.http.get('https://jsonblob.com/api/b0ef0625-b216-11e9-9243-d95533e0ccee')
.subscribe((data: Interface[]) => {
this.interfacesForm = this.fb.group({
interfaces: this.fb.array(data.map(datum => this.generateInterfaceForm(datum)))
});
});
}
addNewInterface() {
(<FormArray>this.interfacesForm.get('interfaces')).push(this.generateInterfaceForm({
id_EquipoOrigen: {},
id_PuertoOrigen: {},
id_EquipoDestino: {},
id_PuertoDestino: {}
}));
}
removeInterfaceAtIndex(index: number) {
(<FormArray>this.interfacesForm.get('interfaces')).removeAt(index);
}
private generateInterfaceForm(interfaceToGenerateFormFor: Interface) {
return this.fb.group({
id_interface: [interfaceToGenerateFormFor.id_interface],
id_EquipoOrigen: this.fb.group({
id_equipo: [interfaceToGenerateFormFor.id_EquipoOrigen.id_equipo],
nombre: [interfaceToGenerateFormFor.id_EquipoOrigen.nombre],
localidad: [interfaceToGenerateFormFor.id_EquipoOrigen.localidad],
categoria: [interfaceToGenerateFormFor.id_EquipoOrigen.categoria],
}),
id_PuertoOrigen: this.fb.group({
id_puerto: [interfaceToGenerateFormFor.id_PuertoOrigen.id_puerto],
nombre: [interfaceToGenerateFormFor.id_PuertoOrigen.nombre],
ultima_actualizacion: [interfaceToGenerateFormFor.id_PuertoOrigen.ultima_actualizacion],
}),
estatus: [interfaceToGenerateFormFor.estatus],
etiqueta_prtg: [interfaceToGenerateFormFor.etiqueta_prtg],
grupo: [interfaceToGenerateFormFor.grupo],
if_index: [interfaceToGenerateFormFor.if_index],
bw: [interfaceToGenerateFormFor.bw],
bw_al: [interfaceToGenerateFormFor.bw_al],
id_prtg: [interfaceToGenerateFormFor.id_prtg],
ospf: [interfaceToGenerateFormFor.ospf],
description: [interfaceToGenerateFormFor.description],
id_EquipoDestino: this.fb.group({
id_equipo: [interfaceToGenerateFormFor.id_EquipoDestino.id_equipo],
nombre: [interfaceToGenerateFormFor.id_EquipoDestino.nombre],
localidad: [interfaceToGenerateFormFor.id_EquipoDestino.localidad],
categoria: [interfaceToGenerateFormFor.id_EquipoDestino.categoria],
}),
id_PuertoDestino: this.fb.group({
id_puerto: [interfaceToGenerateFormFor.id_PuertoDestino.id_puerto],
nombre: [interfaceToGenerateFormFor.id_PuertoDestino.nombre],
ultima_actualizacion: [interfaceToGenerateFormFor.id_PuertoDestino.ultima_actualizacion],
}),
ultima_actualizacion: [interfaceToGenerateFormFor.ultima_actualizacion],
});
}
}
在模板中:
<form [formGroup]="interfacesForm" *ngIf="interfacesForm">
<div formArrayName="interfaces">
<div *ngFor="let interface of interfacesForm.controls['interfaces'].controls; let i = index">
<div [formGroupName]="i">
<label for="">id_interface</label>
<input type="text" formControlName="id_interface">
<br>
<label for="">estatus</label>
<input type="text" formControlName="estatus">
<br>
<label for="">etiqueta_prtg</label>
<input type="text" formControlName="etiqueta_prtg">
<br>
<label for="">grupo</label>
<input type="text" formControlName="grupo">
<br>
<label for="">if_index</label>
<input type="text" formControlName="if_index">
<br>
<label for="">bw</label>
<input type="text" formControlName="bw">
<br>
<label for="">bw_al</label>
<input type="text" formControlName="bw_al">
<br>
<label for="">id_prtg</label>
<input type="text" formControlName="id_prtg">
<br>
<label for="">ospf</label>
<input type="text" formControlName="ospf">
<br>
<label for="">description</label>
<input type="text" formControlName="description">
<br>
<label for="">ultima_actualizacion</label>
<input type="text" formControlName="ultima_actualizacion">
<br>
<div formGroupName="id_EquipoOrigen">
<h4>id_EquipoOrigen</h4>
<label for="">id_equipo</label>
<input type="text" formControlName="id_equipo">
<br>
<label for="">nombre</label>
<input type="text" formControlName="nombre">
<br>
<label for="">localidad</label>
<input type="text" formControlName="localidad">
<br>
<label for="">categoria</label>
<input type="text" formControlName="categoria">
<br>
</div>
<button (click)="removeInterfaceAtIndex(i)">Remove Interface</button>
<br>
<br>
<hr>
</div>
</div>
<button (click)="addNewInterface()">Add Interface</button>
</div>
</form>
这是您推荐的Working Sample StackBlitz。