Angular 2 Model Driven Form の Drop Down List で説明されている問題と同様の問題があります(ただし、選択ボックスへのモデル バインディングははるかに単純です)。
テンプレートは非常にシンプルで、基本的に「Dear x」のリストで、x はサービスによって提供されます。
<form novalidate [formGroup]="myForm">
<div class="form-group">
<label for="salutation">Dear ...</label>
<select id="salutation"
class="form-control"
formControlName="salutation">
<option value="">Please select how to address the customer</option>
<option *ngFor="let sal of salutations"
[value]="sal">{{sal}}
</option>
</select>
</div>
</form>
コンポーネントでは、この選択ボックスのデータを取得するサービスにサブスクライブします (console.log
実際にデータが到着することを示しています)。
ngOnInit() {
this.createFormControls();
this.createForm();
this.proposalStateService.emitProposal.subscribe(
data => {
console.log('subscribe fired: ');
console.log(data);
this.salutations = [
'Mr & Mrs ' + data.last_name,
'Mrs ' + data.last_name,
'Ms ' + data.last_name,
'Mr ' + data.last_name,
data.first_name
];
}
);
}
createFormControls() {
this.salutation = new FormControl(this.salutations, Validators.required);
}
createForm() {
this.myForm = new FormGroup({
salutation: this.salutation
});
}
サービスからの値でフォームを更新するためにこれらの方法を試しましたが、どれも機能していないようです:
グループをリセットする
this.myForm = this.formBuilder.group({ salutation: [this.salutations] });
フォームの値にパッチを当てる
this.myForm.patchValue(this.salutation, this.salutations);
コントロールに値を設定する
this.salutation.setValue(this.salutations);
フォームから値を設定します
this.myForm.controls['salutation'].setValue(this.salutations);
明らかに何かが欠けています...しかし、何ですか?
元の質問に編集
コンソールにデータの到着が表示されることがありましたが、コードをクリーンアップしてさらにテストした後、console.log
このコンポーネントがロードされたときにイベントが表示されなくなりました。これはタイミングの問題に違いないと思います.必要なデータを発行するサービスがすでに起動した後に、コンポーネントがロードされている可能性があります.
このコンポーネントは、次のように、navigate イベントで親コンポーネントによってロードされます。
/parent.component.ts
ngOnInit() {
this.newProposal = new Proposal;
this.newProposal.step = 1;
this.proposalStateService.emitProposal.subscribe(
data => {
this.router.navigate(['pages/proposals/new/step' + data.step]);
}
);
この emitProposal は、ユーザーがデータをドロップすることによってこのコンポーネントで起動され、このメソッドが呼び出されます。
private initProposal(customer, step) {
this.newProposal.first_name = customer.first_name;
this.newProposal.last_name = customer.last_name;
this.newProposal.customer_id = customer.id;
this.newProposal.email = customer.email;
this.newProposal.mobile = customer.mobile;
this.newProposal.status = 'Draft';
this.newProposal.step = step;
this.proposalStateService.pushProposal(this.newProposal);
}
この「pushProposal」は、子コンポーネントがロードされる前に起動されるようですが、それが問題になる可能性はありますか?
(今、ログが以前に受信したデータをどのように示していたのか疑問に思っています、はは、この質問を書いている間に一体何を変更したのですか!?)