Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在NGM模块之间共享服务和状态 我们如何在ngrx模块之间使用ngrx共享状态 我们如何在NGM模块之间共享相同的服务实例_Javascript_Angular_Ngrx - Fatal编程技术网

Javascript 如何在NGM模块之间共享服务和状态 我们如何在ngrx模块之间使用ngrx共享状态 我们如何在NGM模块之间共享相同的服务实例

Javascript 如何在NGM模块之间共享服务和状态 我们如何在ngrx模块之间使用ngrx共享状态 我们如何在NGM模块之间共享相同的服务实例,javascript,angular,ngrx,Javascript,Angular,Ngrx,Angular2-RC5。模块需要具有相同的服务实例。要实现这一点,该服务需要仅位于bootsrapAppModule的providers中。否则,如果在不同的提供程序中找到相同的服务,则可能正在运行并行实例 因此问题变成了:如何在顶级提供者中获得服务,但将其从所有其他模块中排除 通过您自己编写的服务,它非常简单 如果该服务是AppModule的一部分,则将其放入该模块的提供程序中,而不是其他任何地方 如果该服务位于您要导入到其他模块的另一个模块中(我们称之为DummyModule),请确保不

Angular2-RC5。

模块需要具有相同的服务实例。要实现这一点,该服务需要仅位于bootsrap
AppModule
providers
中。否则,如果在不同的提供程序中找到相同的服务,则可能正在运行并行实例

因此问题变成了:如何在顶级
提供者中获得服务,但将其从所有其他模块中排除

通过您自己编写的服务,它非常简单

  • 如果该服务是
    AppModule
    的一部分,则将其放入该模块的
    提供程序中,而不是其他任何地方
  • 如果该服务位于您要导入到其他模块的另一个模块中(我们称之为
    DummyModule
    ),请确保不要将其放入
    DummyModule
    提供程序中,否则角度注入器将为导入
    DummyModule
    的每个延迟加载模块创建一个并行实例。相反,您希望从
    forRoot()静态方法公开该服务
    
因此,改变:

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

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

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

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


这就是我为获得第三方服务--
mdiservice
(棱角材料模块的一部分)--而做的,即使其模块尚未正确配置,也可以作为单个实例工作

你说的模块之间是什么意思?模块还是组件?正如他所说,他的意思是
@NgModule
。这是一个有效的问题,我正试图弄清楚这一点,但我恐怕目前唯一的解决办法就是把所有东西都塞进根模块。我认为我们需要等待ngrx效果更新到RC5。@Filip Lauc感谢您的澄清。也许像ng2 redux这样的自由主义者能解决这个问题?他们可能会。但是我想我宁愿等待ngrx更新,然后一起切换到一个新的库。好的,我已经阅读了angular2网站上所有模块的信息,现在我了解了你写的内容和它非常好的解决方案。我不能接受这个答案,因为我仍然不明白如何共享在不同模块中声明的减缩器。(或者没有解决方案,我们只能在应用程序模块上做一次(太糟糕了))。谢谢仅需确认,大约一年后,这确实是ngrx 4提倡的方法。在其示例应用程序(平台repo的一部分)中,有一个类似上面的DummyModule的模块,称为AuthModule。看见
@NgModule({
  providers: [] //empty since we want a singleton service
})
export class DummyModule{
  static forRoot() {
    return {ngModule: DummyModule, providers: [ MyService ]};
  }
}