我们说我有一个Angular 2,其结构如下:
换句话说,有一个根父组件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
中,然后使用C
在P
装饰器中将MyService
声明为提供程序。这样可以确保@Component
的每个实例(以及它的所有子组件)都会收到自己的providers: [MyService]
实例:
但是,我想避免这种解决方案,因为像这样创建一个中间包装器组件似乎是很多额外的锅炉板,它还需要重组组件在组件P
中的布局方式。模板。
在Angular 2中有没有简单的方法来实现这一目标?谢谢!
答案 0 :(得分:1)
托管注入器和MyService
提供程序的父组件是正确的解决方案。这就是Angular 2 DI的工作原理。即使存在可以创建MyServiceFactory
类实例的单例服务MyService
,它如何确定B
和C
应该接收公共MyService
实例,考虑到有几个B
和C
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方法在他们自己的私有通道上相互通信。我觉得很酷。