РЕДАКТИРОВАТЬ: В соответствии с пожеланиями OP, мы хотели бы сохранить объект в качестве значения в select, для этого мы можем вместо того, чтобы использовать formgroup внутри formarray, просто нажать formcontrols, который затем содержит значения объекта:
this.group.users.forEach(u => {
this.users.push(this.fb.control(u)) // just push formcontrol!
});
, а затем отметьте в шаблоне:
<select [formControlName]='i' [compareWith]="compareFn">
<option *ngFor="let a of avaliableUsers" [ngValue]='a'>{{a.login}}</option>
</select>
Поскольку мы теперь используем значение объекта в качестве formcontrol, при попытке сопоставления предустановленных значений нам нужна функция compareWith:
compareFn(a, b): boolean {
return a.id === b.id;
}
StackBlitz
ОРИГИНАЛЬНЫЙ ОТВЕТ:
Я бы, возможно, позвонилфункция, когда выбор изменяется, а затем найти пользователя из availableUsers
и установить значение формы для login
с найденным пользователем.Итак, шаблон:
<select formControlName='id' (change)="findLogin(u)">
<option *ngFor="let a of avaliableUsers" [ngValue]='a.id'>{{a.login}}</option>
</select>
Таким образом, вы можете удалить compareWith
, так как теперь мы используем число для значения.Затем функция findLogin
, где мы передаем текущую группу форм из итерации:
findLogin(group: FormGroup) {
const user = this.avaliableUsers.find(x => x.id === group.get('id').value)
group.get('login').setValue(user.login);
}
Ваш разветвленный StackBlitz