所以我有一个复杂的形式来创建一个实体,我想用它来编辑我也在使用新的角形式API。我将表单的结构与从数据库中检索的数据完全一致,因此我想将整个表单的值设置为此处检索的数据,这是我想要做的一个示例:
this.form = builder.group({
b : [ "", Validators.required ],
c : [ "", Validators.required ],
d : [ "" ],
e : [ [] ],
f : [ "" ]
});
this.form.value({b:"data",c:"data",d:"data",e:["data1","data2"],f:data});
PS:NgModel不适用于新的表单api我也不介意在模板中使用单向数据绑定,如
<input formControlName="d" value="[data.d]" />
有效,但在数组的情况下会很痛苦
答案 0 :(得分:169)
要设置所有 FormGroup值, setValue :
this.myFormGroup.setValue({
formControlName1: myValue1,
formControlName2: myValue2
});
要设置仅一些值,请使用 patchValue :
this.myFormGroup.patchValue({
formControlName1: myValue1,
// formControlName2: myValue2 (can be omitted)
});
使用第二种技术,不需要提供所有值,并且不会设置未设置值的字段。
答案 1 :(得分:6)
您可以使用form.get获取特定的控件对象并使用setValue
this.form.get(<formControlName>).setValue(<newValue>);
答案 2 :(得分:5)
对于控件为FormGroup的设置值,可以使用此示例
this.clientForm.controls['location'].setValue({
latitude: position.coords.latitude,
longitude: position.coords.longitude
});
答案 3 :(得分:3)
正如评论中所指出的那样,在提出这个问题时,不支持此功能。此问题已在角度2 rc5
中得到解决答案 4 :(得分:3)
是的,您可以使用setValue设置值以进行编辑/更新。
this.personalform.setValue({
name: items.name,
address: {
city: items.address.city,
country: items.address.country
}
});
您可以参考http://musttoknow.com/use-angular-reactive-form-addinsert-update-data-using-setvalue-setpatch/了解如何使用setValue将反应表单用于添加/编辑功能。它节省了我的时间
答案 5 :(得分:2)
我已经实现了临时解决方案,直到angular2支持形式updateValue
initFormGroup(form: FormGroup, data: any) {
for(var key in form.controls) {
console.log(key);
if(form.controls[key] instanceof FormControl) {
if(data[key]){
let control = <FormControl>form.controls[key];
this.initFormControl(control,data[key]);
}
} else if(form.controls[key] instanceof FormGroup) {
if(data[key]){
this.initFormGroup(<FormGroup>form.controls[key],data[key]);
}
} else if(form.controls[key] instanceof FormArray) {
var control = <FormArray>form.controls[key];
if(data[key])
this.initFormArray(control, data[key]);
}
}
}
initFormArray(array: FormArray, data: Array<any>){
if(data.length>0){
var clone = array.controls[0];
array.removeAt(0);
for(var idx in data) {
array.push(_.cloneDeep(clone));
if(clone instanceof FormGroup)
this.initFormGroup(<FormGroup>array.controls[idx], data[idx]);
else if(clone instanceof FormControl)
this.initFormControl(<FormControl>array.controls[idx], data[idx]);
else if(clone instanceof FormArray)
this.initFormArray(<FormArray>array.controls[idx], data[idx]);
}
}
}
initFormControl(control: FormControl, value:any){
control.updateValue(value);
}
用法:
this.initFormGroup(this.form, {b:"data",c:"data",d:"data",e:["data1","data2"],f:data});
注意:表单和数据必须具有相同的结构,我使用lodash深度克隆jQuery,其他lib也可以这样做
答案 6 :(得分:0)
&#34; NgModel不使用新表格api&#34;。
那不是真的。你只需要正确使用它。如果您使用的是反应形式,则应使用与反应式指令一起使用NgModel。见the example in the source。
/*
* @Component({
* selector: "login-comp",
* directives: [REACTIVE_FORM_DIRECTIVES],
* template: `
* <form [formGroup]="myForm" (submit)='onLogIn()'>
* Login <input type='text' formControlName='login' [(ngModel)]="credentials.login">
* Password <input type='password' formControlName='password'
* [(ngModel)]="credentials.password">
* <button type='submit'>Log in!</button>
* </form>
* `})
* class LoginComp {
* credentials: {login:string, password:string};
* myForm = new FormGroup({
* login: new Control(this.credentials.login),
* password: new Control(this.credentials.password)
* });
*
* onLogIn(): void {
* // this.credentials.login === "some login"
* // this.credentials.password === "some password"
* }
* }
*/
虽然它看起来像TODO comments,但可能会删除并替换为反应式API。
// TODO(kara): Replace ngModel with reactive API
@Input('ngModel') model: any;