【问题标题】:Is there a way to use value from template in Angular2 dependency injection?有没有办法在 Angular2 依赖注入中使用模板中的值?
【发布时间】:2016-04-21 23:11:37
【问题描述】:

我有一个使用 2 个子组件的 Angular2 组件。模板看起来像

<component-A/>
<component-B/>

我想将组件 A 实例注入到组件 B 的构造函数中。有没有办法在我的根组件的提供程序中引用组件 A?

【问题讨论】:

  • l我认为在这种情况下构造函数注入是不可能的。您能否详细说明您实际尝试完成的工作?可能还有其他方法可以实现它。你需要 A 的引用来做什么?
  • 我有 2 个组件,一个是设计面,另一个是用于设置模式的设计面的控制面板:绘图、选择等。我希望控制面板采用设计表面组件的实例作为注入。
  • 我不知道这是否可能,但对我来说,像这样耦合组件没有意义。为了在它们之间共享代码,我建议改为通过服务共享逻辑。

标签: angular


【解决方案1】:

这首先打破了制造两个组件的整个目的。由于您使一个依赖于另一个,因此您不能单独重用它们,不妨将它们合而为一。

创建一个父组件,其中包含两个组件以及它们都需要的信息,并将该信息设置为每个子组件为@Inputs:

https://angular.io/docs/ts/latest/api/core/Input-var.html

一些原始示例:

<component-A (modeSelected)="selectedMode==$event"/>
<component-B [mode]="selectedMode" />

或:

<component-A #modeSelector/>
<component-B [mode]="modeSelector.selectedMode" />

() 表示输出,[] 表示输入。

在第一个示例中,selectedMode 是父控制器的属性,其中包含 A 和 B 组件。在第二个示例中,selectedMode 是组件 A 的属性。

【讨论】:

  • 这不是真的,因为我想将设计表面抽象为一个界面。将来我可能会有不同类型的设计表面,都需要在同一组模式之间切换。
  • 设计表面是什么意思?
  • 哦,好的,我在问题中阅读了您的 cmets,所以这样做的方法是,控制面板组件向父组件发送 @Output 告诉他选择的模式,父持有这个选择在作为 @input 传递给 Design Surface 组件的属性中的模式,Design Surface 组件会在此值更改时做出反应,更新模板所基于的模型。
  • 我更新了答案,展示了一些如何做到这一点的原始示例。
  • 嗯,有没有办法直接把控制面板挂到设计面上?这种方法的问题在于,使用这两个组件的每个根组件都必须了解所有模式和所有内容。我想要一个 ComponentA 和一个 ComponentA-Controller。控制器提供 UI 来操作 ComponentA 的设置。需要操作哪些属性的细节最好对根组件不透明。根组件应该只负责将两者连接起来。
猜你喜欢
  • 2021-04-27
  • 2017-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-26
  • 1970-01-01
相关资源
最近更新 更多