javascript - 如何在 ngModules 之间共享服务和状态

标签 javascript angular ngrx

  1. 我们如何使用 ngrx 在 ngModules 之间共享状态?
  2. 我们如何在 ngModules 之间共享同一个服务实例?

Angular2-RC5。

最佳答案

模块需要有相同的服务实例。要实现这一点,该服务需要仅位于您的 Bootstrap AppModuleproviders 中。否则,如果在不同的提供商中发现相同的服务,您可能正在运行并行实例。

那么问题就变成了:如何在顶级 providers 中获取服务,但将其从所有其他模块中排除?

使用您自己编写的服务,这非常简单。

  • 如果该服务是 AppModule 的一部分,则将它放在该模块的 providers 中,而不是其他地方
  • 如果该服务位于您要导入其他模块的另一个模块(我们称它为 DummyModule)中,请确保将其放入DummyModuleproviders 或 Angular 注入(inject)器将为每个导入 DummyModule 的惰性加载模块创建一个并行实例。相反,您希望通过 forRoot() 静态方法公开该服务。

所以改变:

@NgModule({
  providers: [ MyService]
})
export class DummyModule{ }

收件人:

@NgModule({
  providers: [] //empty since we want a singleton service
})
export class DummyModule{
  static forRoot() {
    return {ngModule: DummyModule, providers: [ MyService ]};
  }
}

现在,当常规模块imports: [DummyModule] 时,它们将不会获得MyService。另一方面,在 AppModule 中,您有 imports: [DummyModule.forRoot()] 来公开服务。因此,只有最顶层的组件才能获得服务,并且您将拥有一个在所有模块之间共享的实例。

使用第 3 方服务,这并不简单。

基本上,如果第 3 方开发人员也使用 @NgModule,则您需要第 3 方开发人员进行上述更改。或者,您可以创建一个自定义模块,而不是导入第 3 方模块,该模块声明该模块的组件、管道和指令,但实现上述更改以将该模块的服务放入 forRoot() 方法中。

这就是我为获得第 3 方服务所做的工作——MdIconService(Angular Material 模块的一部分)——作为单个实例工作,即使它的模块尚未正确配置. See this github issue.

关于javascript - 如何在 ngModules 之间共享服务和状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39182027/

相关文章:

javascript - Angular 2 - 如何在等待 http 请求完成时阻止 GUI 渲染

ngrx - 如何使用ngrx/effects执行多个相关操作/效果/ Action

angular - 参数类型 'action' 和 'action' 在 Angular ngrx 存储项目中不兼容

angular - 当 URL 的查询参数发生更改时,如何调度 NGRX 操作?

javascript - 按 viewBox 值移动事件 SVG

javascript - 使用 Jquery 检查多个复选框

php - 禁用 javascript 时根据 javascript 验证保护表单的最佳方法

javascript - 打开时,模态内的 Iframe 不会滚动到顶部

angular - Rxjs - 使用 observables 作为值重新映射对象

javascript - 在有或没有 jquery 的情况下使用延迟 Angular promise 的正确方法是什么?