我正在使用Angular Core/Feature/Shared
模块模式。
呈现CoreComponent
(应用程序的主页)时,DataStorageService
的构造函数(在CoreComponent
的构造函数中使用)被多次调用(结果是每次调用构造函数时都会调用AJAX)
请不要将我的问题标记为重复,因为我的问题与之前在此处提出并回答过的类似问题有些不同。
我附加了代码以显示我的意思(为简单起见,我将其缩短了。)
core / shared.module.ts
@NgModule({
declarations: [...],
imports: [...],
exports: [... ],
})
export class SharedModule {
static forRoot(): ModuleWithProviders {
return {
ngModule: SharedModule,
providers: [XHRService, DataStorageService]
};
}
}
shared / services / data-storage.service.ts
@Injectable()
export class DataStorageService {
constructor(private xhr: XHRService) {
this.loadEvents()
}
public loadOrigination = () => this.xhr.getOriginationsList().subscribe(this.originationsSource);
public loadEvents = () => this.xhr.getEventsList().subscribe(this.eventsSource);
private eventsSource = new BehaviorSubject(null);
private originationsSource = new BehaviorSubject(null);
public originations$ = this.originationsSource.asObservable();
public events$ = this.eventsSource.asObservable();
}
app.module.ts
@NgModule({
declarations: [...],
imports: [
SharedModule.forRoot(),
...
],
providers: [...],
bootstrap: [AppComponent]
})
export class AppModule { }
core / core.module.ts
@NgModule({
declarations:
[
CoreComponent,
...
],
exports: [
CoreComponent
],
imports: [
CoreRoutingModule,
SharedModule
...
],
})
export class CoreModule { }
core / core.component.ts
@Component({
selector: 'app-dashboard',
templateUrl: './dashboard.component.html',
styleUrls: ['./dashboard.component.scss']
})
export class DashboardComponent implements{
constructor(public dataStorageService : DataStorageService) { }
}
答案 0 :(得分:1)
这是预期的结果,构造函数是该类的默认方法,该方法在实例化该类时执行,并确保正确初始化了该类的所有字段。当Angular构造组件树时,将调用组件的构造函数。所有生命周期挂钩都称为运行更改检测的一部分。因此,每当将核心组件注入任何模块时,都会被调用。
解决此问题的建议是,在构造函数外部删除您的 loadEvents()
/使用ngOnInit生命周期挂钩在组件中调用它。
ngOnInit(){
this.dataStorageService.loadEvents();
}