@Host装饰器如何在注入器树中工作

时间:2017-02-17 09:34:59

标签: javascript angular angular2-di

我试图了解@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'。为什么呢?

2 个答案:

答案 0 :(得分:2)

Host在普通ReflectiveInjector.resolveAndCreate注入器的上下文中没有语义含义。

在编译器外部使用时

It is just ignored

对于所需的行为,

  

我期望得到一个错误,因为据我所知,孙子注入器的主机是子进程,并且子进程器中没有提供依赖关系。

请考虑使用Self

答案 1 :(得分:0)

  

指定进样器应从任何进样器检索依赖关系,直到到达当前组件的主机元素。

https://angular.io/docs/ts/latest/api/core/index/Host-decorator.html

听起来我会寻找供应商并停止照顾它到达组件的注射器。