【发布时间】:2015-11-01 13:28:54
【问题描述】:
我想从模板中定义的组件获取引用。让我们考虑一下我有以下组件:
@Component({
selector: 'a-component'
})
@View({
template: '<another-component #anotherComponent></another-component>',
directives: [AnotherComponent]
})
class AComponent {
callAnotherComponent() {
anotherComponent.doSomething();
}
}
显然这不起作用,我的班级中的 anotherComponent 没有定义。但是有什么简单的方法可以做到这一点吗?在我的情况下,AnotherComponent 应该是一个弹出组件,我想简单地调用类似 myPopupCmp.showMessage("message") 的东西。
我当然可以在我的模板中使用数据绑定并像这样使用它:<another-component [text]="popupText" [visible]="isPopupVisible"></another-component>,并使用这两个成员通过首先设置文本然后使其可见来显示它。在大多数情况下,数据绑定是有意义的,但在这里我想封装属性并避免必须处理使用它的弹出窗口的行为。
编辑:
@EricMartinez 经过一些研究,我已经更新了你的 plnkr,这里是一个 fork 的链接:plnkr。诀窍是使用 @ViewQuery 来查询组件视图中的指令和 dom 元素。我在这个问题中发现了这个:angular2 github。
现在的问题是 _results 似乎是空的,即使如果我在控制台中扩展视图我可以看到我的组件,我什至可以看到它的属性,所以数据以某种方式存在但我无法访问它。有没有使用 QueryLists 的特殊方法?使用 _results 似乎不是很干净,因为 _ 表示它应该是私有的或内部的。我也尝试过先使用,但它总是带来一个空引用。
【问题讨论】:
-
如果让两个组件处于同一级别而不是让它们成为父子组件会怎样?据我所知,组件会创建 Shadow DOM,因此它不会像您在示例中建议的那样直接访问其子级。但是,如果您将它们放在同一级别并将
another-component作为a-component的属性传递,您将可以访问doSomething。看到这个example -
我相信它会起作用,但它看起来不是很干净。我想使用@Query 和@Host 直接注入它,但我似乎无法让它工作。 @Query 总是给我一个空的 QueryList。在上述情况下,我有这样的事情:
constructor(@Query(AnotherComponent) query : QueryList<AnotherComponent>) { console.log(query); // gives an empty list } -
另外问题是我的组件基本上包含一个文本和一个确定按钮,单击时会发出一个事件,以便使用它的组件可以执行诸如重置表单字段或重定向之类的操作等等。因此我需要将组件放在使用它的模板中,因为事件绑定只会上升到我相信的层次结构。
-
嘿@ArnaudBoeglin 关于您的编辑:很好的发现。我找到了这个IQueryList,在这里你可以看到它们是如何遍历查询列表的。我知道的另一件事是,在构造函数中您无法访问结果,但您可以在
onInit中进行操作。请参阅编辑的plnkr。 -
这里是issue。感谢@JesseGood 的建议
标签: angular typescript