У меня есть проект Angular 6, Reactive Forms, который подключается к серверной части ASP.NET Web Api 2 / MS SQL Server 2017.Я нахожусь в процессе подключения внешнего интерфейса и столкнулся с ситуацией, с которой я еще не сталкивался, и не могу найти примеры того, как это сделать:
Вложенные группы FormGroups , чьим объектом являетсяпредставлен элементом select
.То, что я имею до сих пор, не является ошибкой, и, по-видимому, он выбирает правильный элемент в раскрывающемся списке при загрузке.Однако после выбора только обновляет одно поле, а не весь объект.
I думаю Мне нужно использовать formGroupName="company"
, чтобы сообщить registerOnChange()
, какой элемент управленияискать и затем какую-то форму formControlName="..."
, но я не понимаю, как это сделать с элементами select
или option
, чтобы добиться того, что я ищу.Мне нужен выбор для обновления всего объекта, а также свойств идентификатора и имени.
Нажмите здесь, чтобы просмотреть редактор StackBlitz / демонстрационную версию
site-edit.component.html
...
<form class="form-horizontal" novalidate (ngSubmit)="save()" [formGroup]="siteForm">
<fieldset>
...
<div class="form-group" formGroupName="company">
<label class="col-md-2 control-label" for="companyId">Company</label>
<div class="col-md-8">
<select id="companyId" class="form-control" formControlName="company">
<option *ngFor="let company of companies" [ngValue]="company.name">
{{ company.name }}
</option>
</select>
</div>
</div>
...
</fieldset>
</form>
site-edit.component.ts
siteForm: FormGroup;
// TODO: refactor to use http Company Service instead
companies: Company[] = [
{ id: 1, name: 'Company 1'},
{ id: 2, name: 'Company 2'},
{ id: 3, name: 'Company 3'}
];
site: Site;
constructor(private fb: FormBuilder,
private siteService: SiteService) { }
ngOnInit(): void {
this.siteForm = this.fb.group({
...
company: this.fb.group({
id: null,
name: ''
}),
...
});
}
getSite(id: number): void {
this.siteService.getSite(id)
.subscribe(site => this.onSiteRetrieved(site));
}
save(): void {
if (this.siteForm.dirty && this.siteForm.valid) {
// copy form values over the site object values
const s = Object.assign({}, this.site, this.siteForm.value);
// simulate call to save service
console.log('Saved: ' + JSON.stringify(s));
}
}
onSiteRetrieved(site: Site): void {
// clear all the state flags (dirty, touched, etc.)
if (this.siteForm) {
this.siteForm.reset();
}
this.site = site;
// update the data on the form
this.siteForm.setValue({
...
company: {
id: this.site.company.id,
name: this.site.company.name
},
...
});
}
... more