使用公共提供程序延迟加载



我已经在ionic 3项目上实现了延迟加载模式。它工作得很棒。 不过我有一个问题。假设我需要在应用程序上实现本机StatusBar功能。因此,我必须在每个页面上以不同的方式实现它,我将其放在app.module.ts上,如下所示。

providers: [
StatusBar,
]

这是好方法还是我需要在每个组件的模块上注入StatusBar作为provider?对我来说,这似乎是多余的工作。但是最好的方法是什么,为什么会这样?

尽管@SrAxi的答案是完美的,但在 Ionic 中使用 Cordova 插件时,由于插件仅用作提供程序(而不是整个模块(,您只需将其添加到app.module.ts文件的提供程序数组中,一切应该都可以正常工作。

这是使用大多数 cordova 插件的推荐方法(因为它们不是模块,只是提供程序(

如果您希望全局使用该服务,则可以将StatusBar添加到 AppModule 的providers中。但是,如果实例不仅是StatusBarService,则可能会给您带来一些实例问题。(我对这种方法有一些问题(。

想象你有,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中。

相关内容

  • 没有找到相关文章

最新更新