Angular 2 个响应式表单,select 控件由服务填充

Angular 2 Reactive Forms, select control filled from service

我正在尝试使用 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' select 元素留下空值 selected(有选项,但 selected 不正确).我应该如何重新连接我的组件以确保在从服务获取帐户值并将它们添加到 select?

后绑定 accountFromId

原来我在找Promise.all()。我不得不等待来自服务的 transfer 和 account[] 实体,然后绑定到表单。更新后的工作代码如下:

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]);
            })
        }
    })
}