Получите доступ к локальной переменной из шаблона в контроллере в Angular2

Я пишу компонент, где мне нужен доступ к исходному элементу <audio controls>. Я делаю это так, получая его в ngOnInit(), используя ElementRef, как этот this.elementRef.nativeElement.querySelector("audio");

Пока он работает, я думаю, что он очень нечеткий и Angular2 также предупреждает о рисках при использовании ElementRef.

Нет ли более простого способа?

Можно ли пометить его как локальную переменную с <audio controls #player> и каким-то образом получить доступ к собственному элементу через this.player или что-то похожее от контроллера?

import {Component, OnInit, ElementRef, Input} from 'angular2/core';

@Component({
    selector: 'audio-preview',
    template: `
        <audio controls>
            <source [src]="src" type="audio/mpeg">
            Your browser does not support the audio element.
        </audio>
    `
})

export class AudioPreview implements OnInit {

    @Input() src: string;

    constructor(public elementRef: ElementRef) {}

    ngOnInit() {
        var audioElement = this.getAudioElement();
        audioElement.setAttribute('src', this.src);
    }

    getAudioElement() : HTMLAudioElement {
        return this.elementRef.nativeElement.querySelector("audio");
    }
}

Ответ 1

  • Используйте @ViewChild для доступа к некоторому элементу в представлении.
  • Используйте [attr.src] для создания привязки к атрибуту 'src' элемента.
  • Используйте Renderer, если по какой-то причине вам необходимо внести изменения в DOM.

См. эту панель.

import {Component, Input, ViewChild, Renderer} from 'angular2/core';

@Component({
  selector: 'audio-preview',
  template: `
    <audio controls #player [attr.src]="src">
      <source [src]="src" type="audio/mpeg">
      Your browser does not support the audio element.
    </audio>
    `
})
export class AudioPreview {
  @Input() src: string;
  @ViewChild('player') player;

  constructor(public renderer: Renderer) {}

  ngAfterViewInit() {
    console.log(this.player);

    // Another way to set attribute value to element
    // this.renderer.setElementAttribute(this.player, 'src', this.src);
  }
}