我在ionic 3
项目上实现了延迟加载模式。它工作得非常棒。
我有一个问题。让我说我需要在app上实现原生StatusBar
功能。我必须以不同的方式在每个页面上实现它,我已将其放在app.module.ts
上,如下所示。
providers: [
StatusBar,
]
这是一个好方法还是我需要在每个组件的模块上注入StatusBar
作为provider
?对我而言,这似乎是多余的工作。但是这样做的最佳方式是什么?为什么会这样?
答案 0 :(得分:2)
尽管@ SrAxi的答案是完美的,但在Ionic中使用Cordova插件时,由于插件只是用作提供程序(而不是整个模块),您只需将其添加到提供程序数组即可。 app.module.ts
文件,一切都应该正常。
这是使用大多数cordova插件的推荐方法(因为它们不是模块,只是提供商)
答案 1 :(得分:1)
如果您希望全局使用该服务,可以将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的文档之后,您应该为您的Core功能创建一个模块,为用户的上下文创建另一个模块,为Orders创建另一个模块,为客户创建另一个模块等。如果你知道我的内容的意思。
因此,不要向AppModule
添加服务,而是尝试为应用中的每个主要上下文创建一个模块,然后将其添加到imports
中的AppModule
。