Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 获取对模板中组件的引用_Angular_Typescript - Fatal编程技术网

Angular 获取对模板中组件的引用

Angular 获取对模板中组件的引用,angular,typescript,Angular,Typescript,我想从模板中定义的组件获取引用。让我们考虑下面的组成部分: @Component({ selector: 'a-component' }) @View({ template: '<another-component #anotherComponent></another-component>', directives: [AnotherComponent] }) class AComponent { callAnotherComponen

我想从模板中定义的组件获取引用。让我们考虑下面的组成部分:

@Component({
    selector: 'a-component'
})
@View({
    template: '<another-component #anotherComponent></another-component>',
    directives: [AnotherComponent]
})
class AComponent {

    callAnotherComponent() {
        anotherComponent.doSomething();
    }

}
@组件({
选择器:“a组件”
})
@看法({
模板:'。诀窍是使用@ViewQuery,它用于查询组件视图中的指令和dom元素。我在这个问题中发现了这个问题:

现在的问题是_结果似乎是空的,即使我在控制台中扩展视图时可以看到我的组件,我甚至可以看到它的属性,所以数据在那里,但我无法访问它。有没有一种使用querylist的特殊方法?使用_结果似乎不是很干净,因为_表示它应该是私有的,或者我可以INTERNAL。我也尝试使用first,但它总是带来一个空引用。

到目前为止,您应该能够做到:

class AComponent {
    constructor(@Query('#anotherComponent') query:QueryList<AnotherComponent>) {

    }
}
类组件{
构造函数(@Query('#anotherComponent')查询:QueryList){
}
}

总之,我不得不使用decorator@ViewQuery:

class AComponent {

    private _anotherComponentQuery : QueryList<AnotherComponent>;

    constructor(@ViewQuery('anotherComponent') query : QueryList<AnotherComponent>) {
    this._anotherComponentQuery = query;
}

    onInit() {
        for(component of this._anotherComponentQuery){
            //component.instance.callMethod()
        }
    }

}
类组件{
private\u另一个组件查询:QueryList;
构造函数(@ViewQuery('anotherComponent')查询:QueryList){
这个.\u另一个组件query=query;
}
onInit(){
对于(此组件的另一个组件查询){
//component.instance.callMethod()
}
}
}
这里需要注意两件重要的事情,ViewQuery返回的组件在这里是ComponentRef,因为在我的模板中它是一个组件。否则它将是一个ElementRef,我相信在一个简单的HTML标记的情况下。另一件事是,在我的组件的构造函数中,查询是空的,因为我相信模板没有被解析而QueryList是动态的,每当我的视图发生变化时(比如我添加满足查询的元素),它都会被更新。因此,诀窍是要么以后才访问查询,例如在事件处理程序中,要么在作为组件生命周期一部分的onInit中访问。奇怪的是,如果我定义lifecyle onInit并导入onInit,代码将永远不会通过我的方法onInit(),而且它在不导入任何内容的情况下工作得很好..算了吧!

请看这个,
似乎与answer中的方法相同,但如果您知道引用的子组件的名称,则不需要迭代查询结果。

如果您让两个组件处于同一级别,而不是使它们成为父子组件,会怎么样?据我所知,组件会创建阴影DOM,因此它不会像您一样直接访问其子组件在您的示例中提出建议。但是如果您将它们放在同一级别,并将
另一个组件
作为
a-component
的属性传递,您将可以访问
doSomething
。看到了吗?我相信它会起作用,但不知怎的,它看起来不是很干净。我想使用@Query和@Host直接将其注入,但我看不到m使其工作。@Query总是给我一个空的QueryList。在上面的例子中,我有这样的东西:
构造函数(@Query(另一个组件)Query:QueryList){console.log(Query);//给一个空列表}
还有一个问题是,我的组件基本上包含一个文本和一个Ok按钮,单击该按钮时会发出一个事件,以便使用它的组件可以执行一个操作,例如重置表单字段或重定向等。因此,我需要将该组件放在使用它的模板中,因为事件绑定只会上升一级我相信是archy。嘿@ArnaudBoeglin关于你的编辑:很好的发现。我发现了这个,在这里你可以看到他们是如何在QueryList上迭代的。我知道的另一件事是,在构造函数中你没有访问结果的权限,但是你可以在
onInit
中完成。请看编辑的。这是。谢谢你的建议@JesseGoodHey there@PascalPrecht,我不是OP,但我对你的答案感兴趣(我不知道这种查询方式),但我无法使它在这种情况下工作。你能看到它吗?(注意:在plnkr中,QueryList不起作用,你可以指定QueryList或组件名称)你是说它应该是字符串中的另一个组件,而不是另一个组件?不管我怎么做,QueryList都是空的,我明天会查看提交的代码,以了解发生了什么。但我怀疑问题是因为我们试图获取引用的组件在模板中。我不过,这肯定行得通。@EricMartinez我试着玩plnkr,QueryList的行为确实很奇怪。在我的本地版本中,我使用QueryList没有问题,它应该可以与组件一起工作,因为它们是一个视图指令。我做了一些改进并更新了我的原始帖子,有关更多信息,请参阅编辑。谢谢!请注意,在onInit中,我无法获取组件,我必须在afterViewInit()中请求它。