我试图了解@Host
装饰器的工作原理如何与视图组件解耦。所以我创建了以下注入器树:
class Dependency {
}
@Injectable()
class NeedsDependency {
constructor(@Host() public dependency: Dependency) {
console.log(this.dependency); // outputs 'A', but I expected the error
}
}
const parent = ReflectiveInjector.resolveAndCreate([{provide: Dependency, useValue: 'A'}]);
const child = parent.resolveAndCreateChild([]);
const grandchild = child.resolveAndCreateChild([NeedsDependency]);
grandchild.get(NeedsDependency);
我预计会收到错误,因为我了解grandchild
注入器的主机是child
,并且Dependency
注入器中没有提供child
。但是,当我运行此代码时,我从根注入器中注入'A'
。为什么呢?
答案 0 :(得分:2)
Host
在普通ReflectiveInjector.resolveAndCreate
注入器的上下文中没有语义含义。
对于所需的行为,
我期望得到一个错误,因为据我所知,孙子注入器的主机是子进程,并且子进程器中没有提供依赖关系。
请考虑使用Self
。
答案 1 :(得分:0)
指定进样器应从任何进样器检索依赖关系,直到到达当前组件的主机元素。
https://angular.io/docs/ts/latest/api/core/index/Host-decorator.html
听起来我会寻找供应商并停止照顾它到达组件的注射器。