【问题标题】:How does @Host decorator work in injector tree@Host 装饰器如何在注入器树中工作
【发布时间】:2017-07-06 18:21:27
【问题描述】:

我试图了解@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,而 child 注入器中没有提供 Dependency。然而,当我运行这段代码时,我得到了从根注入器注入的'A'。为什么?

【问题讨论】:

  • 在哪里提供NeedsDependencyNgModelComponent)?
  • 本例中没有角框架,是解耦的
  • 那么你不应该期望@Host()有任何效果。
  • @GünterZöchbauer,我不太确定。 @Optional@Self@SkipSelf do 等其他装饰器在与角度解耦时会起作用
  • 当然,它们在与 Angular 一起使用时也独立于组件,但 @Host() 与组件有直接关系。如果没有组件,如何找到组件的注入器?

标签: javascript angular angular2-di


【解决方案1】:

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

It is just ignored 在编译器外部使用时。

对于期望的行为,

我预计会出现错误,因为据我了解,孙注入器的主机是子注入器,并且子注入器中没有提供依赖关系。

考虑改用Self

【讨论】:

  • 知道了,谢谢,我想知道它是如何在注入器和角度编译器中处理的
  • 前段时间对同一件事感到好奇。带有指令/组件装饰器的类有自己的注入器,构造器装饰器为它们处理additionally,包括编译器相关的主机和属性。
  • 太好了,感谢您的链接,我会探索的。我希望有人会为 angular1 写一本书到writing your own angular
  • @Maximus 不客气。哈,这本书会很厚,这可能会导致另一个过度设计的框架。当 A2 为我工作时我很高兴,但内部结构每次都让我毛骨悚然。
  • 是的,对我来说习惯阅读 TS 资源需要时间,但我认为阅读资源有助于成长为开发人员。缺点是需要大量时间
【解决方案2】:

指定注入器应从任何注入器检索依赖项,直到到达当前组件的宿主元素。

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

在我看来,它会寻找提供者并在它到达组件的注入器后停止寻找。

猜你喜欢
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 2018-05-30
  • 2019-12-07
  • 2017-10-21
  • 2020-09-01
相关资源
最近更新 更多