我正在开发一个Angular 4.X项目,我试图在按钮点击时创建一些HTML输入字段(主要是类型文本)。我正在使用Angular反应形式并尝试使用Angular FormArray实现此目的。我已经在plunker上编写了代码,但它显示了一些错误。
以下是我创建的插件的链接 - http://plnkr.co/edit/PCFD43GK91zo2ivQ9lf7?p=preview
为便于参考,请找到以下代码 -
//our root app component
import {Component, NgModule} from '@angular/core'
import {BrowserModule} from '@angular/platform-browser'
import { FormBuilder, FormGroup, Validators, FormArray, FormControl } from '@angular/forms';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
@Component({
selector: 'my-app',
template: `<hr>
<div>
<form [formGroup]="orderForm" (ngSubmit)="OnSubmit(orderForm.value)">
<div>
<input type="text" formControlName="customerName"/>
<input type="text" formControlName="email"/>
</div>
<div formArrayName="items" *ngFor="let item of orderForm.get('items').controls; let i = index;">
<div [formGroupName]="i">
<input type="text" formControlName="name" placeholder="Item name"/>
<input type="text" formControlName="description" placeholder="Item description"/>
<input type="text" formControlName="price" placeholder="Item price"/>
</div>
Chosen name: {{ orderForm.controls.items.controls[i].controls.name.value }}
</div>
<button type="submit">Save</button>
<button type="button" (click)="addItem()">Add More</button>
</form>
<div>`,
})
export class App {
constructor(private fb: FormBuilder) { }
public items:any[];
public orderForm: FormGroup;
ngOnInit() {
this.orderForm = this.formBuilder.group({
customerName: '',
email: '',
items: this.formBuilder.array([ this.createItem()])
});
}
createItem(): FormGroup {
return this.formBuilder.group({
name: '',
description: '',
price: ''
});
}
addItem(): void {
this.items = this.orderForm.get('items') as FormArray;
this.items.push(this.createItem());
}
public OnSubmit(formValue: any) {
console.log(formValue);
}
}
@NgModule({
imports: [ BrowserModule, FormsModule, ReactiveFormsModule ],
declarations: [ App ],
bootstrap: [ App ]
})
export class AppModule {}
如果有人能弄清楚它有什么问题,我将非常感谢。
答案 0 :(得分:1)
你需要为orderForm项获取一个getter,而你的FormBuilder的变量名应该是你在你的构造函数中声明的'fb'或'formBuilder'你在哪里使用的
export class App {
constructor(private formBuilder: FormBuilder) { }
public orderForm: FormGroup;
ngOnInit() {
this.orderForm = this.formBuilder.group({
customerName: '',
email: '',
items: this.formBuilder.array([ this.createItem()])
});
}
createItem(): FormGroup {
return this.formBuilder.group({
name: '',
description: '',
price: ''
});
}
get items(): FormArray {
return this.orderForm.get('items') as FormArray;
};
addItem(): void {
this.items.push(this.createItem());
}
public OnSubmit(formValue: any) {
console.log(formValue);
}
}
html代码
<div>
<form [formGroup]="orderForm" (ngSubmit)="OnSubmit(orderForm.value)">
<div>
<input type="text" formControlName="customerName"/>
<input type="text" formControlName="email"/>
</div>
<div formArrayName="items" *ngFor="let item of items.controls; let i = index;">
<div [formGroupName]="i">
<input type="text" formControlName="name" placeholder="Item name"/>
<input type="text" formControlName="description" placeholder="Item description"/>
<input type="text" formControlName="price" placeholder="Item price"/>
</div>
Chosen name: {{ orderForm.controls.items.controls[i].controls.name.value }}
</div>
<button type="submit">Save</button>
<button type="button" (click)="addItem()">Add More</button>
</form>
<div>
答案 1 :(得分:0)
您正在导入private fb: FormBuilder
但在此之后尝试拨打this.formBuilder.something
。将其更改为this.fb.something
如果仍然无效,请尝试直接将代码从ngOnInit
放到构造函数方法中。