在不共享相同父组件的子组件之间共享Angular 2服务

时间:2017-01-16 22:49:16

标签: angular typescript angular2-services

我们说我有一个Angular 2,其结构如下:

enter image description here

换句话说,有一个根父组件j = 0 i = 0 n = 4 line = 1 7 3 0 j = 1 i = 0 n = 4 line = 1 7 3 0 j = 2 i = 0 n = 4 line = 1 7 3 0 j = 3 i = 0 n = 4 line = 1 7 3 0 j = 0 i = 1 n = 4 line = ,它包含两个不同子组件1 7 3 0 9 5 2 4 1 8 1 9 3 7 9 2 A的实例。

现在说我要创建一个B类,以便在子组件的每个垂直列中共享。更具体地说,我希望能够将C注入到组件MyService和组件MyService的构造函数中,使用Angular创建整个服务的两个实例(一个用于第一个子组件的列和子组件的第二列的另一列。)

执行此操作的一种方法是将每个子组件列包装在中间组件B中,然后使用CP装饰器中将MyService声明为提供程序。这样可以确保@Component的每个实例(以及它的所有子组件)都会收到自己的providers: [MyService]实例:

enter image description here

但是,我想避免这种解决方案,因为像这样创建一个中间包装器组件似乎是很多额外的锅炉板,它还需要重组组件在组件P中的布局方式。模板。

在Angular 2中有没有简单的方法来实现这一目标?谢谢!

2 个答案:

答案 0 :(得分:1)

托管注入器和MyService提供程序的父组件是正确的解决方案。这就是Angular 2 DI的工作原理。即使存在可以创建MyServiceFactory类实例的单例服务MyService,它如何确定BC应该接收公共MyService实例,考虑到有几个BC s?

除非存在无法解决的布局问题,否则最好使用父组件。否则,它可以是MyService提供者的指令,

@Directive({
  selector: '[p]',
  providers: [MyService]
})
class P {}

导致使用

进行透明布局
<ng-container p>
  <b></b>
  <c></c>
</ng-container>
<ng-container p>
  <b></b>
  <c></c>
</ng-container>

答案 1 :(得分:0)

两个组件订阅的静态EventEmitter怎么样?

有一天,我在某个地方看到了(如果我记得我会给一个链接)。我现在使用它没有明显的缺点,我会看到应用程序何时增长。

//the "commands dispatcher" class :

import { EventEmitter } from '@angular/core';

export class CommandsDispatcherService {
  private static store: { [channel: string]: EventEmitter<any> } = {};

  static get(channel: string): EventEmitter<any> {
    if (!this.store[channel]) {
      this.store[channel] = new EventEmitter();
    }
    return this.store[channel];
  }
}

组件A&amp; B(没有任何层次关系)只导入类(没有提供者),在init上订阅它并使用get方法在他们自己的私有通道上相互通信。我觉得很酷。