angular - 如何在模板中访问,反应形式,数组中的数组
问题描述
我是编程的初学者,我试图理解我做错了什么。:)
我创建了一个反应式表单,其中包含一个字符串数组,该数组包含一个字符串和一个字符串数组。
json 文件如下所示:
public dbData: any = {
'ITEMS':[
{
'NAME': 'Farine',
'QUANTITY': ['140', '60']
}]
};
当我提交它看起来正确:
但我没有到达在模板中正确显示它:(
page.ts:
export class Form2Page implements OnInit, OnDestroy {
itemsForm: FormGroup;
constructor(private formBuilder: FormBuilder) {}
ngOnInit() {
this.initForm();
}
initForm() {
this.itemsForm = new FormGroup({
'items': new FormArray([])
});
console.log('From initForm', this.itemsForm);
}
onFormSubmit() {
console.log('Submit : ', this.itemsForm.value);
}
onAddItems() {
const control = new FormGroup({ name: new FormControl(''),
quantity: new FormArray([])});
(<FormArray>this.itemsForm.get('items')).push(control);
console.log('Add From', this.itemsForm);
}
页面.html
<ion-content>
<div>
{{dbData.ITEMS[0].QUANTITY[1]}}
</div>
<form [formGroup]="itemsForm" (ngSubmit)="onFormSubmit()">
<ion-button type="button" (click)="onAddItems()">New Item</ion-button>
<div formArrayName="items">
<div *ngFor="let itemsCtrl of itemsForm.get('items').controls; let i=index">
<h4>ITEMS</h4>
<div [formGroupName]="i">
<ion-label>Name :
<input type="text" formControlName="name">
</ion-label>
<br>
<div formArrayName="quantity">
<div *ngFor="let quantityCtrl of itemsForm.get('items').controls.get('quantity').controls; let j = index">
<ion-label>Quantity :
<input type="text" [formControlName]="j">
</ion-label>
<br>
</div>
</div>
</div>
</div>
</div>
<ion-button type="submit">Submit</ion-button>
</form>
</ion-content>
谢谢你的帮助 :)
解决方案
我还没有在 Ionic 中实现。但是你也可以在 Ionic 中使用完全相同的东西:
import { Component } from '@angular/core';
import { FormBuilder, FormGroup, FormArray, FormControl } from '@angular/forms';
export interface Data {
ITEMS: Array<Item>;
}
export interface Item {
NAME: string;
QUANTITY: Array<string>;
}
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
dbData: Data = {
'ITEMS': [
{
'NAME': 'Farine',
'QUANTITY': ['140', '60']
}]
};
itemsForm: FormGroup;
constructor(private formBuilder: FormBuilder) { }
ngOnInit() {
this.itemsForm = new FormGroup({
'ITEMS': this.formBuilder.array(this.dbData.ITEMS.map(item => this.createItem(item)))
});
}
onFormSubmit() {
console.log('Submit : ', this.itemsForm.value);
}
onAddItems() {
(<FormArray>this.itemsForm.get('ITEMS')).push(this.createItem({ NAME: '', QUANTITY: [] }));
}
addQuantity(i) {
(<FormArray>(<FormArray>this.itemsForm.get('ITEMS')).at(i).get('QUANTITY')).push(this.formBuilder.control(''));
}
private createItem(item: Item) {
return this.formBuilder.group({
NAME: [item.NAME],
QUANTITY: this.formBuilder.array(item.QUANTITY.map(item => this.formBuilder.control(item)))
});
}
}
在模板中:
<pre>{{ itemsForm.value | json }}</pre>
<form [formGroup]="itemsForm" (ngSubmit)="onFormSubmit()">
<button type="button" (click)="onAddItems()">New Item</button>
<div formArrayName="ITEMS">
<div *ngFor="let itemsCtrl of itemsForm.get('ITEMS').controls; let i=index">
<h4>ITEMS</h4>
<div [formGroupName]="i">
<label>Name :
<input type="text" formControlName="NAME">
</label>
<br>
<div formArrayName="QUANTITY">
<div
*ngFor="let item of itemsCtrl.get('QUANTITY').controls; let j = index">
<label>Quantity :
<input type="text" [formControlName]="j">
</label>
<br>
</div>
<button (click)="addQuantity(i)">Add Quantity</button>
</div>
</div>
</div>
</div>
<button type="submit">Submit</button>
</form>
这是您参考的工作示例 StackBlitz。
推荐阅读
- python - Heroku 每 24 小时更新一次其中的文件
- reactjs - ReactJS 中的动态弹出框
- python - Python Selenium 如何使用现有的 chromedriver 窗口?
- javascript - Angular2:touchStart 和 touchEnd 在移动视图中没有正确响应
- r - R plotly sankey节点不透明度
- javascript - 如何在不使用正文解析器的情况下获取 POST 正文
- java - 将对象的 ArrayLIst 转换为字符串 2D 数组
- excel - Office.js Excel - range.getImage() 的问题
- sql-server - SSRS:报告订阅按非周期计划运行
- php - $变量 = $变量 = $变量 = 数组()