如何在angular 2应用中使DateAdapter单例?

时间:2018-11-14 08:01:17

标签: javascript angular typescript angular7

我正在开发带有延迟加载模块的angular 7应用程序。我也在使用角形材料组件。我想在datepicker组件中本地化并支持多个语言环境。

当应用程序语言更改时,我想对整个应用程序进行全局更改。可以通过DateAdapter.setLocale方法完成。 但是问题是,如果我在根模块上进行了更改,则在延迟加载的模块中也不会更改。

是的,延迟加载的模块具有其注入器并接收其DateAdapter,但其语言环境未设置为正确的语言适配器。

如何在整个应用程序中实现DateAdapter为单例?对于其他模块,有一个forChild()vs forRoot()API,但没有针对datepicker模块。

1 个答案:

答案 0 :(得分:2)

对我来说,问题是我将DateAdapter导入了SharedModule,然后又将SharedModule导入了AppModule和其他LazyModule中。


要使DateAdapter为单例服务,您应该提供DateAdapter,而该DateAdapter仅在应用程序的根级别使用一次,而不是在根级别和LazyModules中使用。

为此,请确保您导入提供MatNativeDateModule的模块,例如AppModule,仅在您的MatNativeDateModule中(或像CoreModule一样仅导入一次的另一个根模块中)。不要在多个模块中或在像SharedModule这样多次导入的模块中导入import { MatNativeDateModule } from '@angular/material/core' @NgModule({ declarations: [ AppComponent, ], imports: [ MatNativeDateModule ], bootstrap: [AppComponent] }) export class AppModule { }

export class AppComponent implements OnInit {
  constructor(private dateAdapter: DateAdapter<Date>) {}

  ngOnInit(): void {
    this.dateAdapter.setLocale('en')
  }
}

然后,您可以在AppComponent中设置区域设置。

{{1}}

并且具有设置区域设置的相同DateAdapter将注入到您的LazyModules中。