【发布时间】:2016-08-09 03:40:12
【问题描述】:
我正在尝试访问在某些 HTML 中使用选择器创建的组件。我的印象(似乎是错误的)提供者会寻找现有实例并在注入另一个组件时提供该实例,但显然我误解了分层提供者创建过程。
在下面,我有一个组件,它在其模板 HTML 中使用选择器来创建 TopLevelComponent 的实例。
我正在尝试通过创建提供程序并使用 DI 通过构造函数推送该实例来访问该 TopLevelComponent。
(抱歉,如果这段代码不完美,我只是整理了一个简单的例子。)
@component({
selector: 'my-app',
template: '<top-level-component></top-level-component>',
directives: [TopLevelComponent],
providers: [TopLevelComponent],
})
export class MyApp {
constructor( private topLevelComponent: TopLevelComponent) {
}
}
@component({
selector: 'top-level-component',
template: '',
})
export class TopLevelComponent {
constructor() {
console.log('CONSTRUCTED A TopLevelComponent...');
}
}
但是,我没有将一个 TopLevelComponent 实例传递给我的组件,而是得到了两个(调试日志中存在两个“CONSTRUCTED A TopLevelComponent ...”日志证明了这一点)。
如果我从构造函数中删除 'private topLevelComponent: TopLevelComponent',我只会得到该组件的一个实例,但我似乎无法掌握它。
所以我有两个问题
- 如何使用DI将选择器创建组件的实例传递给其他组件的构造函数
或
- 如果我没有在应用程序 HTML 中包含
<top-level-component></top-level-component>,我如何将该 HTML 注入应用程序以使其正确呈现?
第三个
- 如果以上两种方法都可以,推荐哪种方法?
我认为@ViewChild 是正确的方法,因为(!)这个组件只有一个实例,但由于它被注入到许多不同的组件中,我认为这是不可能的。
【问题讨论】:
-
您能否提供一个 Plunker 来演示您究竟想要完成什么?
-
@GünterZöchbauer 这是 Plunker 显示我正在尝试做的事情 - embed.plnkr.co/J3G1VBDW0p4FGovLBnI7。如您所见,“CONSTRUCTED An InjectingComponent...”被打印了两次。我试图将由“
”创建的“InjectingComponent”实例传递给“ReceivingComponent”,但我得到了一个单独的组件。鉴于 InjectingComponent 可以传递给多个其他组件(而不仅仅是本示例中的 ReceivingComponent),我认为 ViewChild 不适合。 -
我已经提到过给
providers添加一个组件是没有用的。您也不能注入兄弟姐妹,只能注入祖先。请参阅我的更新答案以获取可能的解决方案。
标签: javascript html angular typescript