SharedModule Service构造函数被多次调用

时间:2019-11-11 01:40:37

标签: angular

我正在使用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) { }

}

1 个答案:

答案 0 :(得分:1)

这是预期的结果,构造函数是该类的默认方法,该方法在实例化该类时执行,并确保正确初始化了该类的所有字段。当Angular构造组件树时,将调用组件的构造函数。所有生命周期挂钩都称为运行更改检测的一部分。因此,每当将核心组件注入任何模块时,都会被调用。

解决此问题的建议是,在构造函数外部删除您的 loadEvents() /使用ngOnInit生命周期挂钩在组件中调用它。

 ngOnInit(){
   this.dataStorageService.loadEvents();
 }