Значение Angular2 для formGroup
Таким образом, у меня есть сложная форма для создания сущности, и я хочу использовать ее для редактирования, а также я использую новый 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]" />
это работает, но это будет боль в случае массивов
Ответы
Ответ 1
Чтобы установить все значения FormGroup, используйте setValue:
this.myFormGroup.setValue({
formControlName1: myValue1,
formControlName2: myValue2
});
Чтобы установить только некоторые значения, используйте patchValue:
this.myFormGroup.patchValue({
formControlName1: myValue1,
// formControlName2: myValue2 (can be omitted)
});
При использовании этого второго метода не нужно указывать все значения, и поля, значения которых не были заданы, не будут затронуты.
Ответ 2
Для заданного значения, когда ваш элемент управления FormGroup может использовать этот пример
this.clientForm.controls['location'].setValue({
latitude: position.coords.latitude,
longitude: position.coords.longitude
});
Ответ 3
Как отмечалось в комментариях, эта функция не была поддержана в тот момент, когда был задан этот вопрос. Этот вопрос был разрешен в угловом 2 rc5
Ответ 4
Я внедрил временное решение, пока 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, и другие библиотеки могут также делать
Ответ 5
Да, вы можете использовать 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. Это сэкономило мое время
Ответ 6
"NgModel не работает с новыми формами api".
Это неправда. Вам просто нужно использовать его правильно. Если вы используете реактивные формы, NgModel следует использовать совместно с реактивной директивой. См. Пример в источнике.
/*
* @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, это, вероятно, будет удалено и заменено реактивным API.
// TODO(kara): Replace ngModel with reactive API
@Input('ngModel') model: any;