【问题标题】:Lazy loading with common provider使用公共提供程序延迟加载
【发布时间】:2017-12-04 12:29:55
【问题描述】:

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

providers: [
    StatusBar,
]

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

【问题讨论】:

  • 如果模块不是延迟加载,您可以注册提供者多个模块,根注入器向提供者收费一次,如果模块延迟加载,则在子注入器中注册提供者。当应用启动时,根注入器不允许添加新的提供者
  • 抱歉,我没有完全理解您所说的内容。您能提供更多信息吗?我已经在我的项目上实现了延迟加载。所以现在所有的组件都支持延迟加载。 @alehn96
  • 因为它只是一个提供者(而不是整个模块),你可以将它添加到app.module.ts 文件的提供者数组中。这是使用大多数 cordova 插件的推荐方式(因为它们不是模块,只是 providers)。
  • 我认为你的评论最适合Ionic context。你能把它作为答案吗?谢谢。@sebaferreras
  • 希望你看到我的反馈没有? @sebaferreras

标签: angular typescript ionic-framework ionic2 ionic3


【解决方案1】:

尽管@SrAxi 的回答很完美,但在 Ionic 中使用 Cordova 插件时,由于插件只是用作提供者(而不是整个模块),您可以将其添加到 providers 数组中app.module.ts 文件,一切正常。

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

【讨论】:

  • 谢谢! :D 但是,我不知道 StatusBar 是一个 Cordova 插件.. :( 无论如何,很高兴知道!谢谢!:P
【解决方案2】:

如果您希望该服务在全球范围内使用,您可以将 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,而是尝试为您应用中的每个主要上下文创建一个模块,然后将它们添加到您的 imports AppModule

【讨论】:

  • 感谢您详细解释如何使用 Angular 处理它。但我想知道如何使用 Ionic 处理它。特别是 StatuBar 是一个 Cordova 插件。
  • @Sampath 哦,伙计!对不起!不知道 StatusBar 是一个 Cordova 插件! :S
猜你喜欢
  • 1970-01-01
  • 2020-07-08
  • 1970-01-01
  • 2020-12-12
  • 2018-03-24
  • 1970-01-01
  • 1970-01-01
  • 2018-09-30
  • 2012-05-25
相关资源
最近更新 更多