加载表单后从服务填充下拉列表
Populate a dropdown list from a service after form has loaded
我遇到了与 中描述的问题类似的问题(尽管绑定到 select 框的模型要简单得多)。
模板很简单,基本上就是一个'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>
在组件中,我订阅了一项获取此 select 框数据的服务(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
});
}
我已经尝试了这些方法来让表单使用来自服务的值进行更新,但是其中 none 似乎有效:
重置群组
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
事件现在不显示此组件何时加载。我认为这一定是一个时间问题 - 可能是在发出所需数据的服务已经触发后加载组件。
该组件由父组件在导航事件中加载,如下所示:
/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' 在子组件加载之前被触发了,这可能是问题所在吗?
(现在我想知道之前的日志是如何显示正在接收数据的,哈,我写这个问题时到底改变了什么!?)
好的,所以我找到了解决方案 - 感谢那些帮助评论和链接到其他问题的人。
当我将表单移动到父级时,数据到达并使用选项 (4) 加载到表单中:
this.myForm.controls['salutation'].setValue(this.salutations);
但显然我不希望它放在那里,并且只在父级导航后加载它。
所以这个问题的解决方案是通过允许它 'store' 父推送的对象来增强服务。因此发射器已经从这个改变:
emitProposal = new EventEmitter<Proposal>();
pushProposal(value: Proposal) {
this.emitProposal.emit(value);
}
对此:
currentProposal: Proposal;
getCurrentProposal() {
return this.currentProposal;
}
emitProposal = new EventEmitter<Proposal>();
pushProposal(value: Proposal) {
this.currentProposal = value;
this.emitProposal.emit(value);
}
现在表单只需要这样做:
ngOnInit() {
this.createFormControls();
this.createForm();
this.proposal = this.proposalStateService.getCurrentProposal();
this.salutations = [
'Mr & Mrs ' + this.proposal.last_name,
'Mrs ' + this.proposal.last_name,
'Ms ' + this.proposal.last_name,
'Mr ' + this.proposal.last_name,
this.proposal.first_name
];
}
我遇到了与
模板很简单,基本上就是一个'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>
在组件中,我订阅了一项获取此 select 框数据的服务(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
});
}
我已经尝试了这些方法来让表单使用来自服务的值进行更新,但是其中 none 似乎有效:
重置群组
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
事件现在不显示此组件何时加载。我认为这一定是一个时间问题 - 可能是在发出所需数据的服务已经触发后加载组件。
该组件由父组件在导航事件中加载,如下所示:
/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' 在子组件加载之前被触发了,这可能是问题所在吗?
(现在我想知道之前的日志是如何显示正在接收数据的,哈,我写这个问题时到底改变了什么!?)
好的,所以我找到了解决方案 - 感谢那些帮助评论和链接到其他问题的人。
当我将表单移动到父级时,数据到达并使用选项 (4) 加载到表单中:
this.myForm.controls['salutation'].setValue(this.salutations);
但显然我不希望它放在那里,并且只在父级导航后加载它。
所以这个问题的解决方案是通过允许它 'store' 父推送的对象来增强服务。因此发射器已经从这个改变:
emitProposal = new EventEmitter<Proposal>();
pushProposal(value: Proposal) {
this.emitProposal.emit(value);
}
对此:
currentProposal: Proposal;
getCurrentProposal() {
return this.currentProposal;
}
emitProposal = new EventEmitter<Proposal>();
pushProposal(value: Proposal) {
this.currentProposal = value;
this.emitProposal.emit(value);
}
现在表单只需要这样做:
ngOnInit() {
this.createFormControls();
this.createForm();
this.proposal = this.proposalStateService.getCurrentProposal();
this.salutations = [
'Mr & Mrs ' + this.proposal.last_name,
'Mrs ' + this.proposal.last_name,
'Ms ' + this.proposal.last_name,
'Mr ' + this.proposal.last_name,
this.proposal.first_name
];
}