Получите доступ к локальной переменной из шаблона в контроллере в 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);
}
}