Angular 2 Reactive Forms, выберите элемент управления, заполненный из службы
Я пытаюсь использовать реактивные формы Angular, и мне сложно понять, как отложить привязку значений по умолчанию для раскрывающихся списков, заполняемых службой. Вот фрагменты кода моего компонента:
export class TransferComponent {
id: number;
accounts: Account[] = [];
myForm: FormGroup;
transfer: Transfer;
constructor(
private http: Http,
private fb: FormBuilder,
private route: ActivatedRoute,
private transferService: TransferService,
private accountService: AccountService,
private router: Router) {
this.transfer = new Transfer();
this.myForm = fb.group({
'id': [null],
'accountFromId': [this.transfer.accountFromId, Validators.required],
'accountToId': [this.transfer.accountToId, Validators.required],
'title': [this.transfer.title, Validators.required],
'amount': [this.transfer.amount, Validators.required],
'transferDate': [this.transfer.transferDate, Validators.required]
});
}
ngOnInit(): void {
this.accountService.getAccountList()
.then(accounts => this.accounts = accounts);
this.route.queryParams.subscribe(params => {
this.id = params['id'];
if (this.id) {
this.transferService.getTransfer(this.id)
.then(transfer => {
this.transfer = transfer;
this.myForm.setValue(transfer);
});
}
});
}
Идея здесь состоит в том, чтобы попытаться получить параметр 'id', вызвать службу для объекта переноса и связать его с предварительно заполненными раскрывающимися списками с записями счета. Часть моего взгляда выглядит так:
<select class="form-control"
id="accountFromInput"
[formControl]="myForm.controls['accountFromId']">
<option *ngFor="let acc of this.accounts" value="{{acc.id}}">{{acc.name}}</option>
</select>
Передача сущности привязывается правильно для большинства полей, но элемент выбора accountFromId остается с выбранным пустым значением (опции есть, но не выбраны правильно). Как я должен перемонтировать свой компонент, чтобы убедиться, что accountFromId привязан после получения значений учетной записи из сервиса и добавления их для выбора?
1 ответ
Оказывается, я искал Promise.all(). Мне пришлось подождать как службы передачи, так и учетные записи [] из служб, а затем связать их с формой. Обновленный и рабочий код ниже:
export class TransferComponent {
id: number;
accounts: Account[] = [];
myForm: FormGroup;
submitted: boolean = false;
saved: boolean = false;
constructor(
private http: Http,
private fb: FormBuilder,
private route: ActivatedRoute,
private transferService: TransferService,
private accountService: AccountService,
private router: Router) {
this.myForm = fb.group({
'id': [null],
'accountFromId': [null, Validators.required],
'accountToId': [null, Validators.required],
'title': [null, Validators.required],
'amount': [null, Validators.required],
'transferDate': [null, Validators.required]
});
}
ngOnInit(): void {
var accountPromise:Promise<Account[]> = this.accountService.getAccountList()
.then(accounts => this.accounts = accounts);
this.route.queryParams.subscribe(params => {
this.id = params['id'];
if (this.id) {
var transferPromise: Promise<Transfer> = this.transferService.getTransfer(this.id);
Promise.all([
accountPromise,
transferPromise
]).then(value => {
this.myForm.setValue(value[1]);
})
}
})
}