Angular2 表单 ControlGroup 持有未定义数量的 Control
Angular2 form ControlGroup who hold an undefined number of Control
如何使用 Angular2 管理包含未定义字段数的表单?
在我的例子中,我需要创建一个用户可以从中添加和删除一些文件块的地方。它就像一个地址簿,用户可以在其中添加一个或十个地址。每个地址都有一些字段,如街道、门牌号等。
我的样子是这样的:
let address = fb.group({
street: fb.control(null, Validators.required),
streetNumber fb.control(null, Validators.required)
});
this.userForm = fb.group({
name: fb.control(null, Validators.required),
firstName: fb.control(null, Validators.required),
address: fb.group({
1: address
})
});
我真的不知道如何在模板中管理它。
我试过在模板中写一些类似的东西,但显然,它不起作用...
<form [ngFormModel]="userForm">
<input type="text" ngControl="name" #name="ngForm"/>
<input type="text" ngControl="firstName" #firstName="ngForm"/>
<div *ngFor="#address of userForm.controls['address'].controls">
<input type="text" ngControl="street" #street="ngForm"/>
<input type="text" ngControl="streetNumber" #streetNumber="ngForm"/>
</div>
编辑
为了更好的解释,我做了一个 Plunker http://plnkr.co/edit/ffYe1479WnxYOQrbxwLF?p=preview
我为你实现了,见Plunker or better yet, Plunker -@waldo
import {Component} from 'angular2/core';
import {
FORM_DIRECTIVES, FormBuilder, ControlGroup, ControlArray, Validators, NgForm, Control,
AbstractControl
} from 'angular2/common';
@Component({
selector: 'my-app',
template: `
<form [ngFormModel]="userForm" *ngIf="userForm">
<p><label><input id="date" type="text" ngControl="name" #name="ngForm"/> Name</label></p>
<p><label><input id="date" type="text" ngControl="firstName" #firstName="ngForm"/> FirstName</label></p>
<h3>Add address</h3>
<ul ngControlGroup="addresses">
<li *ngFor="#ctrl of objToArray(userForm.find('addresses').controls); #i = index"
ngControlGroup="{{ctrl}}">
{{ctrl}}:
<input ngControl="street" placeholder="Street">
<input ngControl="streetNumber" placeholder="StreetNumber">
</li>
</ul>
<div (click)="addAddress()" style="cursor: pointer"> Add Another Address</div>
</form>
`,
directives: [FORM_DIRECTIVES]
})
export class AppComponent {
userForm: ControlGroup;
constructor(private fb: FormBuilder) {
this.userForm = fb.group({
name: fb.control(null, Validators.required),
firstName: fb.control(null, Validators.required),
addresses: fb.group({
address1: fb.group({
street: fb.control(null, Validators.required),
streetNumber: fb.control(null, Validators.required)
})
})
});
console.log(this.userForm);
}
objToArray(o){
return Object.keys(o);
}
addAddress() {
let addressField = this.fb.group({
street: this.fb.control(null, Validators.required),
streetNumber: this.fb.control(null, Validators.required)
});
(<ControlGroup>this.userForm.find('addresses')).addControl(
'address' + (Object.keys((<ControlGroup>this.userForm.find('addresses')).controls).length + 1), addressField);
}
}
如何使用 Angular2 管理包含未定义字段数的表单?
在我的例子中,我需要创建一个用户可以从中添加和删除一些文件块的地方。它就像一个地址簿,用户可以在其中添加一个或十个地址。每个地址都有一些字段,如街道、门牌号等。
我的样子是这样的:
let address = fb.group({
street: fb.control(null, Validators.required),
streetNumber fb.control(null, Validators.required)
});
this.userForm = fb.group({
name: fb.control(null, Validators.required),
firstName: fb.control(null, Validators.required),
address: fb.group({
1: address
})
});
我真的不知道如何在模板中管理它。
我试过在模板中写一些类似的东西,但显然,它不起作用...
<form [ngFormModel]="userForm">
<input type="text" ngControl="name" #name="ngForm"/>
<input type="text" ngControl="firstName" #firstName="ngForm"/>
<div *ngFor="#address of userForm.controls['address'].controls">
<input type="text" ngControl="street" #street="ngForm"/>
<input type="text" ngControl="streetNumber" #streetNumber="ngForm"/>
</div>
编辑
为了更好的解释,我做了一个 Plunker http://plnkr.co/edit/ffYe1479WnxYOQrbxwLF?p=preview
我为你实现了,见Plunker or better yet, Plunker -@waldo
import {Component} from 'angular2/core';
import {
FORM_DIRECTIVES, FormBuilder, ControlGroup, ControlArray, Validators, NgForm, Control,
AbstractControl
} from 'angular2/common';
@Component({
selector: 'my-app',
template: `
<form [ngFormModel]="userForm" *ngIf="userForm">
<p><label><input id="date" type="text" ngControl="name" #name="ngForm"/> Name</label></p>
<p><label><input id="date" type="text" ngControl="firstName" #firstName="ngForm"/> FirstName</label></p>
<h3>Add address</h3>
<ul ngControlGroup="addresses">
<li *ngFor="#ctrl of objToArray(userForm.find('addresses').controls); #i = index"
ngControlGroup="{{ctrl}}">
{{ctrl}}:
<input ngControl="street" placeholder="Street">
<input ngControl="streetNumber" placeholder="StreetNumber">
</li>
</ul>
<div (click)="addAddress()" style="cursor: pointer"> Add Another Address</div>
</form>
`,
directives: [FORM_DIRECTIVES]
})
export class AppComponent {
userForm: ControlGroup;
constructor(private fb: FormBuilder) {
this.userForm = fb.group({
name: fb.control(null, Validators.required),
firstName: fb.control(null, Validators.required),
addresses: fb.group({
address1: fb.group({
street: fb.control(null, Validators.required),
streetNumber: fb.control(null, Validators.required)
})
})
});
console.log(this.userForm);
}
objToArray(o){
return Object.keys(o);
}
addAddress() {
let addressField = this.fb.group({
street: this.fb.control(null, Validators.required),
streetNumber: this.fb.control(null, Validators.required)
});
(<ControlGroup>this.userForm.find('addresses')).addControl(
'address' + (Object.keys((<ControlGroup>this.userForm.find('addresses')).controls).length + 1), addressField);
}
}