2015-12-29 10 views
33

Piszę komponent, w którym potrzebuję dostępu do elementu natywnego <audio controls>. Robię to tak teraz przez coraz to w ngOnInit() za pomocą ElementRef jak ten this.elementRef.nativeElement.querySelector("audio");Dostęp do zmiennej lokalnej z szablonu w kontrolerze w Angular2

Chociaż to działa myślę, że jest bardzo unelegant i Angular2 również warns of the risks when using ElementRef ..

Czy naprawdę nie ma prostszy sposób?

Czy mogę oznaczyć go jako zmienną lokalną z <audio controls #player> i jakoś uzyskać dostęp do elementu macierzystego przez this.player lub coś podobnego z kontrolera?

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"); 
    } 
} 

Odpowiedz

57
  1. Zastosowanie @ViewChild dostęp do jakiś element w widoku.
  2. Użyj [attr.src] do tworzenia powiązania z atrybutem "src" elementu.
  3. Użyj Renderer, jeśli z jakiegoś powodu musisz bezwzględnie zmienić DOM.

Zobacz this plunk.

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); 
    } 
} 
+0

Dzięki! Po prostu wypróbowałem to i '' "' 'wydaje się działać tak samo jak' '' ' '' ... Jaka jest różnica? – skovmand

+1

@skovmand [attr.src] utwórz powiązanie z atrybutem elementu za pomocą metody ['setAttribute()'] (https://developer.mozilla.org/en/docs/Web/API/Element/setAttribute) DOM ('element.setAttribute ('src', src)'). '[src]' tworzy powiązanie z właściwością elementu (wystarczy ustawić go przez 'element.src = src') – alexpods

+0

Muszę zapytać ... gdzie nauczyłeś się używać' # player' w szablonie, a następnie być w stanie uzyskać odniesienie do niego za pomocą 'ViewChild ('player')'? (Muszę zacząć czytać to, co czytasz, ponieważ nie mogę znaleźć tego rodzaju informacji w Angularnych dokumentach. [Strona API ViewChild] (https://angular.io/docs/ts/latest/api/ core/ViewChild-var.html) nie wyjaśnia tego.) –

Powiązane problemy