Angular2 Реактивные формы. Задайте значение по умолчанию для полей формы с раскрывающимся списком.
Как установить значение по умолчанию для всех форм в angular 2 реактивных формах?
Вот plnkr, чтобы воспроизвести проблему
Ниже код не обновляет выпадающие значения, поскольку у него есть связанный с ним объект.
Примечание. Здесь мне нужно установить значение по умолчанию для всех полей формы с ответом, полученным от Backend API.
Component.html
<form [formGroup]="myForm" novalidate (ngSubmit)="save(myForm.value, myForm.valid)">
<div class="form-group">
<label>Country:</label>
<select formControlName="country">
<option *ngFor="let country of masterCountries" [ngValue]="country">{{country.countryName}}</option>
</select>
</div>
<div class="form-group">
<label for="">Name</label>
<input type="text" class="form-control" formControlName="name">
<small [hidden]="myForm.controls.name.valid || (myForm.controls.name.pristine && !submitted)" class="text-danger">
Name is required (minimum 5 characters).
</small>
<!--<pre class="margin-20">{{ myForm.controls.name.errors | json }}</pre>-->
</div>
<button type="submit" class="btn btn-default">Submit</button>
<div class="margin-20">
<div>myForm details:-</div>
<pre>Is myForm valid?: <br>{{myForm.valid | json}}</pre>
<pre>Is myForm submitted?: <br>{{submitted | json}}</pre>
<pre>myForm value: <br>{{myForm.value | json}}</pre>
</div>
Component.ts
export class AppComponent implements OnInit {
public myForm: FormGroup;
public masterCountries: any[] = [{"countryCode":"AF","countryName":"Afghanistan"},{"countryCode":"AL","countryName":"Albania"},{"countryCode":"DZ","countryName":"Algeria"},{"countryCode":"AS","countryName":"American Samoa"},{"countryCode":"AD","countryName":"Andorra"}];
// Sample response received from backend api
public CountryResponse = {country: {"countryCode":"AF","countryName":"Afghanistan"}, name: 'test123'};
constructor(private _fb: FormBuilder) { }
ngOnInit() {
// the short way
this.myForm = this._fb.group({
country: [''],
name: ['', [<any>Validators.required, <any>Validators.minLength(5)]],
});
(<FormGroup>this.myForm)
.setValue(this.CountryResponse, {onlySelf: true});
}
save(model: User, isValid: boolean) {
this.submitted = true;
console.log(model, isValid);
}
}
Сообщите мне, есть ли другой способ установить всю форму.
Ответы
Ответ 1
Просто измените это:
(<FormGroup>this.myForm)
.setValue(this.CountryResponse, {onlySelf: true});
В это:
const selectedCountry = this.masterCountries.find(country => country.countryCode === this.CountryResponse.country.countryCode)
this.CountryResponse.country = selectedCountry;
(<FormGroup>this.myForm)
.setValue(this.CountryResponse, {onlySelf: true});
Как уже говорилось, вам нужно передать ту же ссылку объекта
Ответ 2
Ваш код не работает, потому что хотя ваш this.selectedCountry
имеет одинаковые значения полей с одним из элементов this.masterCountries
, они не являются тем же самым объектом. Это означает, что сравнение select.value === option.value
всегда возвращает false
.
Проще сделать это, просто измените вашу функцию setValue
следующим образом:
(<FormControl>this.form.controls['country'])
.setValue(this.masterCountries[0], { onlySelf: true });
Или вы можете просто установить его при создании FormGroup
:
this.myForm = this._fb.group({
country: [this.masterCountries[0]],
name: ['', [<any>Validators.required, <any>Validators.minLength(5)]],
});
Ответ 3
При объявлении элемента управления формой или инициализации передайте значение по умолчанию в качестве параметра
MyFormControl: FormControl = new FormControl('Default value');