在我的应用程序中,我有两个不同的 bootstrap 模块(@NgModule)在一个应用程序中独立运行.没有一个单独的 bootstrap 模块,现在我希望它们应该相互通信并共享数据.

我知道通过@Injectable服务作为模块中的提供者,我可以在@NgModule下的所有组件中共享数据,但我将如何在两个不同的模块(而不是模块内的组件)之间共享数据.

有没有办法在另一个模块中访问一个服务对象?有没有办法访问浏览器内存中可用的服务对象,并在我的其他模块中使用它?

推荐答案

2021-02-03

在最近的Angular 版本中,这是使用@Injectable({providedIn: 'platform'})解决的

https://angular.io/api/core/Injectable

Original

您可以在Angular之外实例化服务,并提供一个值:

class SharedService {
  ...
}
window.sharedService = new SharedService();

@NgModule({
  providers: [{provide: SharedService, useValue: window.sharedService}],
  ...
})
class AppModule1 {}

@NgModule({
  providers: [{provide: SharedService, useValue: window.sharedService}],
  ...
})
class AppModule2 {}

如果一个应用程序在SharedService中改变状态,或者调用使AN Observableemits 值的方法,并且订阅者位于与emits 器不同的应用程序中,则订阅者中的代码在emits 器的NgZone中执行.

因此,当订阅一个可观察的SharedService使用

class MyComponent {
  constructor(private zone:NgZone, private sharedService:SharedService) {
    sharedService.someObservable.subscribe(data => this.zone.run(() => {
      // event handler code here
    }));
  }
}

另见第How to dynamically create bootstrap modals as Angular2 components?

Angular相关问答推荐

Angular - MSAL用户缺少角色

如何跨不同组件使用ng模板

对子router-outlet 应用主机样式

Rxjs重置执行后的可观察延迟并重新调度Angular

带独立零部件的TranslateLoader[Angular 16]

Angular react 形式验证问题

如何在独立应用程序中全局禁用基于媒体查询的Angular 动画?

VS 2022 停留在运行 Angular 应用程序上

手动关闭 SSE 连接:Angular

ViewChild 和 ContentChild 的所有有效 Select 器是什么?

如何在Angular 4中为数字管道指定语言环境千位分隔符

当父组件上的变量发生变化时重新加载子组件

什么是 Angular 4,我可以从哪里了解更多信息?

未绑定断点 - VS Code | Chrome | Angular

在Angular2中获取服务的域名

@HostBinding 与 Angular 中的变量类

Angular 2 更改事件 - 模型更改

Angular2 Routerlink:添加查询参数

如何对 *ngFor 应用数量限制?

在 Angular 2 中对 observable 进行单元测试