我已经在ionic 3
项目上实现了延迟加载模式。它工作得很棒。 不过我有一个问题。假设我需要在应用程序上实现本机StatusBar
功能。因此,我必须在每个页面上以不同的方式实现它,我将其放在app.module.ts
上,如下所示。
providers: [
StatusBar,
]
这是好方法还是我需要在每个组件的模块上注入StatusBar
作为provider
?对我来说,这似乎是多余的工作。但是最好的方法是什么,为什么会这样?
尽管@SrAxi的答案是完美的,但在 Ionic 中使用 Cordova 插件时,由于插件仅用作提供程序(而不是整个模块(,您只需将其添加到app.module.ts
文件的提供程序数组中,一切应该都可以正常工作。
这是使用大多数 cordova 插件的推荐方法(因为它们不是模块,只是提供程序(
如果您希望全局使用该服务,则可以将StatusBar
添加到 AppModule 的providers
中。但是,如果实例不仅是StatusBar
Service
,则可能会给您带来一些实例问题。(我对这种方法有一些问题(。
想象你有,I18nModule
(用于翻译(,包含它的服务。通过将I18nModule
添加到 AppModule 的imports
中,我将在I18nModule
中拥有多个服务实例。
一个解决方案是使用forRoot()
:
export class I18nModule {
static forRoot() {
return {
ngModule: I18nModule,
providers: [I18nService, MyService1, MyService2]
};
}
}
然后在AppModule
:
imports: [
I18nModule.forRoot(),
]
有了forRoot()
,我们将I18nModule
(及其服务,回到您的问题(实例化为单例。
总结:
如果它只是一个服务,那没关系,但如果它是一个作为模块一部分的服务,你必须注意不要实例化 2 次相同的服务,然后你会花几个小时试图理解为什么一个"工作">服务没有完成它的工作。
更新:
Angular 旨在模块化,因此,鼓励为每个上下文创建模块,例如:
imports: [
BrowserModule,
BrowserAnimationsModule,
FormsModule,
HttpModule,
BrowserAnimationsModule,
CoreModule,
LayoutModule,
I18nModule.forRoot(),
BarHandlingModule, // Example
InventedModule // Example too
],
这意味着在阅读了 Angular 的文档后,您应该为您的核心功能创建一个模块,为用户上下文创建一个模块,为订单创建一个模块,为客户端创建一个模块等。如果你明白我的意思。
因此,与其向AppModule
添加服务,不如尝试为应用中的每个主要上下文创建一个模块,并将其添加到AppModule
中的imports
中。