如何在 TemplateRef 中找到 Element

Posted

技术标签:

【中文标题】如何在 TemplateRef 中找到 Element【英文标题】:How do I find Element inside TemplateRef 【发布时间】:2018-10-29 05:43:01 【问题描述】:

我一直在谷歌搜索,对 angular 5/6 还是有点陌生​​,但我正在尝试看看是否有可能。


问题

假设我有一个模板:

<ng-template #rt let-r="result" let-t="term">
  <ngb-highlight [result]="r.typeAheadDisplayName" [term]="t" ></ngb-highlight>
  <span *ngIf="r.primaryName ">(alias for  r.primaryName ) </span> r.metaData 
</ng-template>

在此模板中,将生成一个按钮,可用作选择选项的一种方式。但是,出于特定原因,我需要能够定位按钮数组的:first-child

我知道我可以选择元素/模板:

@ViewChild('rt') rt : TemplateRef<any>;

但是,我真的可以做一个类似于 jQuery 的 .find 甚至在 AngularJS 中的函数,来定位在这个模板中可以找到的元素。我一直在谷歌搜索,无法找到答案。

【问题讨论】:

使用rt.nativeElement 【参考方案1】:

nativeElement 是您正在寻找的。它将为您提供本机 DOM 节点,然后您可以使用 querySelector 之类的方法来查询子节点。

@Component()
export class MyComponent implements OnInit 
    @ViewChild('rt') rt : ElementRef;

    ngOnInit() 
        const childNode = this.rt.nativeElement.querySelector('.child-class');
    

更新:

要使用ng-template,您可以同时使用ContentChildTemplateRefTemplateRef 仍然嵌入了 ElementRef,因此您仍然可以访问 nativeElement 属性并执行任何您想要的查询。

<ng-template [ngTemplateOutlet]="rt"></ng-template>

@Component(selector: 'my-component')
export class MyComponent implements OnInit 
    @ContentChild('rt') rt: TemplateRef<any>;

    ngOnInit() 
        const childNode = this.rt.elementRef.nativeElement.querySelector('.foo');
    

现在您可以像这样使用该组件:

<my-component>
    <ng-template #rt>
        <div class="foo">Hello world</div>
    </ng-template>
</my-component>

【讨论】:

好的,所以我要修改我的问题,因为我刚刚意识到这是专门针对 ng 模板的。 QuerySelector 不是 templateRef 上的函数 更新了答案。这行得通吗?顺便说一句,我的第一个解决方案仍然可以使用TemplateRef,只需使用this.rf.elementRef.nativeElement 而不是this.rt.nativeElement 是的,非常感谢。这非常有用。 另外,看看my question/answer here。可能与您正在尝试做的事情相似,或者可能是以后的好书签: 我想querySelector 是一个javascript函数。直接在 Angular 代码 w.r.t 中使用 Javascript 函数是否安全?可移植性?我想避免在 Angular 代码中混合 Javascript 代码。你知道如何在不使用纯 JavaScript(Renderer2、ViewChild)的情况下做到这一点吗?

以上是关于如何在 TemplateRef 中找到 Element的主要内容,如果未能解决你的问题,请参考以下文章

从指令中创建/获取 TemplateRef

我可以从字符串创建 TemplateRef 吗?

没有 TemplateRef 的提供者! (NgIf -> 模板参考)

typescript ElementRef,TemplateRef,ViewContainerRef

将数据传递给组件的指令

如何在自定义表格组件中使用子模板来显示每一行?