使用通用提供程序延迟加载

时间:2017-06-30 13:58:03

标签: angular typescript ionic-framework ionic2 ionic3

我在ionic 3项目上实现了延迟加载模式。它工作得非常棒。 我有一个问题。让我说我需要在app上实现原生StatusBar功能。我必须以不同的方式在每个页面上实现它,我已将其放在app.module.ts上,如下所示。

providers: [
    StatusBar,
]

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

2 个答案:

答案 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