使用组件上的模板引用变量访问DOM元素

时间:2017-02-12 02:05:50

标签: javascript angular angular2-template

我试图使用模板引用变量来获取Angular 2模板中组件的DOM元素的引用。这适用于普通的html标记,但在组件上有不同的行为。 e.g。

<!--var1 refers to the DOM node -->
<div #var1></div>

<!--var2 refers to the component but I want to get the DOM node -->
<my-comp #var2></my-comp>

是否有任何方法强制模板引用变量引用DOM节点,即使它位于组件上?如果是这样,它在任何地方都包含在文档中?我在这里找到的唯一文档是https://angular.io/docs/ts/latest/guide/template-syntax.html#!#ref-vars,他们没有详细介绍如何解决变量。

2 个答案:

答案 0 :(得分:3)

这取决于您将如何使用此引用。

1)在模板中没有直接的方法来获取组件DOM引用:

 import {Directive, Input, ElementRef, EventEmitter, Output, OnInit} from '@angular/core';

 @Directive({selector: '[element]', exportAs: 'element'})
 export class NgElementRef implements OnInit
 {
    @Output()
    public elementChange:EventEmitter<any> = new EventEmitter<any>();

    public elementRef:ElementRef;

    constructor(elementRef:ElementRef)
    {
        this.elementRef = elementRef;
        this.elementChange.next(undefined);
    }

    @Input()
    public get element():any
    {
        return this.elementRef.nativeElement;
    }

    public set element(value:any)
    {

    }

    ngOnInit():void
    {
        this.elementChange.next(this.elementRef.nativeElement);
    }
}

用法:

<my-comp [(element)]="var2"></my-comp>
<p>{{var2}}</p>
<!--or-->
<my-comp element #var2="element"></my-comp>
<p>{{var2.element}}</p>

2)您可以在拥有@ViewChild('var2', {read: ElementRef})模板的组件中获取此引用。

答案 1 :(得分:1)

从Angular 8开始,以下内容提供对ElementRef和本机元素的访问。

/**
 * Export the ElementRef of the selected element for use with template references.
 *
 * @example
 * <button mat-button #button="appElementRef" appElementRef></button>
 */
@Directive({
    selector: '[appElementRef]',
    exportAs: 'appElementRef'
})
export class ElementRefDirective<T> extends ElementRef<T> {
    constructor(elementRef: ElementRef<T>) {
        super(elementRef.nativeElement);
    }
}