问题的基本前提如下:
我有一个带有各种(自定义)输入的组件,当这些输入值中的任何一个发生变化时,我对 API 端点进行 HTTP 调用以重新计算我的受众范围,即它是一个 Campaign 系统,并且当用户定义受众人口统计时受众“覆盖面”的变化。
我使用 ngModelChanges 触发呼叫,效果很好。
但是,我的问题是,当组件加载现有数据(来自以前的保存)时,它会填充导致 ngModelChange 触发的输入,从而导致我的 HTTP 调用在页面加载时多次触发。
示例 HTML:
<app-custom-input
id="age-from"
name="age-from"
[(ngModel)]="audienceModel.ageFrom"
[type]="'number'"
(ngModelChange)="calcReach()"
></app-custom-input>
<app-custom-input
id="age-to"
name="age-to"
[(ngModel)]="audienceModel.ageTo"
[type]="'number'"
(ngModelChange)="calcReach()"
></app-custom-input>
注意:我的自定义输入确实实现了ControlValueAccessor
.ts 文件:
calcReach() {
if (!this.loading$.getValue()) {
const filters = {
...this.audienceModel,
audienceFileId: this.campaignService.campaign.audienceFileId
};
this.calcAudienceReach$ = this.campaignService.calcAudienceReach(filters).subscribe((reach: number) => {
console.log('calc audience reach: ', reach);
});
}
}
可以看出,我确实尝试使用在 ngOnInit() 结束时设置为 false 的加载指示器,但由 ngModelChange 触发的调用都发生在(或之前?)OnInit 之后。
我有一个我的组件实现的抽象组件,其中加载指示器定义为:
public loading$: BehaviorSubject<boolean> = new BehaviorSubject(true);
即它的初始值设置为 true(在抽象组件中),并且仅在 ngOnInit 结束时更改为 false(在实际组件中)。