【发布时间】:2016-04-12 18:18:51
【问题描述】:
我正在试验新发布的 Angular beta 0,希望有人可以为我澄清一些事情。
我有一个 AppComponent 作为我项目的主要框架。它的模板创建了一个导航栏,其项目在其 ngOnInit 时被读入 AppComponent 的公共变量(称为“项目”)。 *ngfor 然后渲染项目。这工作正常。
AppComponent 模板的底部是一个 div,其中放置了一个路由器插座。根据用户选择的导航项触发路线并呈现不同的子组件。这也很好用。在其中一个子组件中,我需要引用父 AppComponent 中的变量“items”。我尝试了三种在其构造函数中将 AppComponent 传递给 SubComponent 的方法:
1. constructor(@Host() _host: AppComponent)
2. constructor(@Inject(forwardRef(() => AppComponent)) _host)
3. constructor(@Host() @Inject(forwardRef(() => AppComponent)) _host)
方法 1 在运行时失败,出现“无法解析子组件的所有参数”之类的错误,而方法 2 和 3 有效,但我不明白为什么。这会让人认为,调用 SubComponent 的构造函数时 AppComponent 是未定义的,这是不可能的,因为除非在 AppComponent 模板的 router-outlet 中渲染,否则 SubComponent 不能存在。但是前向参考确实有效。
我可以发布更多代码,但我认为我在这里遗漏了一些概念性的东西?
附带问题 - 我在以前的 alpha 版本中看到装饰器 @View 经常用于组件定义中,例如指定模板。在 Angular 网站上当前的所有示例中,我从未看到 @View 而只有 @Component 装饰器。 @View 现在过时了吗?
【问题讨论】:
-
@View()是为了将来支持一个组件的多个视图。在完全支持之前,您可以使用@Component()。如果您仍然打算使用此功能,那么已经使用@View()注释可能是有意义的。 -
感谢@View() 上的链接和回答。该链接引用了另一篇帖子github.com/angular/angular/issues/3216,其中的最后一条评论解释了模块加载器可能会留下“循环模块依赖关系......在一个模块中未初始化”。我仍然不明白,在运行我的特定应用程序的过程中,加载器将如何甚至可以选择加载我不知道 AppComponent 模块的 SubComponent 版本,因为后者的实例实际上已经存在。无论如何,forwardRef 确实有效,所以我会坚持下去。谢谢!
-
确认存在错误,即使该问题尚未重新打开。
标签: angular angular2-injection