我想编写某种广播机制,以便在我的用户上下文中动态创建和使用EventEmitter
。为此,我注入一个EmitterService
@Injectable()
export class BroadcastService implements OnInit {
private _emitters: { [channel: string]: EventEmitter<any> } = {};
constructor() {}
get(channel: string): EventEmitter<any> {
if (!this._emitters[channel]) {
this._emitters[channel] = new EventEmitter();
}
return this._emitters[channel];
}
ngOnInit() { }
}
我的组件结构如下所示:
[root]
| |
[comp-a][comp-b]
在我的root
组件中,我注入BroadcastService
以确保每个子组件使用相同的广播通道。此外还注入了AuthService
等其他服务(在root
中,基本上也是我的用户上下文)
@Component({
provider: [BroadcastService, AuthService]
})
AuthService
(和其他人)正在使用BroadcastService
来发送事件:
@Injectable()
export class AuthService extends BaseService {
constructor(
http: Http,
@Inject(BroadcastService) private emitterService: BroadcastService)
{
super(http);
}
...
// Example usage of Broadcast
login(username: string, password: string) {
// do the login, when successfully:
this.emitterService.get("online").emit(true);
}
}
我得到的错误:
EXCEPTION: Cannot resolve all parameters for 'AuthService'(Http, undefined @Inject(undefined)). Make sure that all the parameters are decorated with Inject or have valid type annotations and that 'AuthService' is decorated with Injectable.
我尝试了什么:
BroadcastService
,结果相同最奇怪的部分是,这适用于我的其他服务之一,而不适用于其他服务(嗯,我没有尝试所有,但我试过的那些不起作用)。你有什么线索可能是什么问题吗?或者这可能只是一个错误(我在2.0.0-beta.2中使用angular2)
答案 0 :(得分:5)
似乎需要forwardRef
@Injectable()
export class AuthService extends BaseService {
constructor(
http: Http,
@Inject(forwardRef(() => BroadcastService)) private emitterService: BroadcastService)
{
super(http);
}
...
// Example usage of Broadcast
login(username: string, password: string) {
// do the login, when successfully:
this.emitterService.get("online").emit(true);
}
}
也可能(或代替)
@Component({
provider: [BroadcastService, AuthService]
})
取决于您的代码组织方式。 当每个类在其自己的文件中定义时,这不是必需的。