2015-12-29 9 views
33

में नियंत्रक में टेम्पलेट से स्थानीय चर का उपयोग करें मैं एक घटक लिख रहा हूं जहां मुझे <audio controls> देशी तत्व तक पहुंच की आवश्यकता है। मैं इसे इस तरह अब ngOnInit() में यह हो रही द्वारा इस this.elementRef.nativeElement.querySelector("audio");Angular2

तरह ElementRef का उपयोग करते समय यह काम करता है मुझे लगता है कि यह बहुत unelegant है और Angular2 भी warns of the risks when using 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"); 
    } 
} 

उत्तर

57
  1. उपयोग @ViewChild ध्यान में रखते हुए कुछ तत्व तक पहुँचने के लिए।
  2. किसी तत्व के 'src' विशेषता को बाध्यकारी बनाने के लिए [attr.src] का उपयोग करें।
  3. किसी कारण से आपको DOM को अनिवार्य रूप से बदलने की आवश्यकता है, तो Renderer का उपयोग करें।

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

धन्यवाद !! मैंने अभी कोशिश की है, और '' ऑडियो नियंत्रण #player [attr.src] = "src"> '' '' '' 'ऑडियो नियंत्रण #player [src] =" src ">' '' क्या अंतर है? – skovmand

+1

@skovmand [attr.src] ['setAttribute()'] (https://developer.mozilla.org/en/docs/Web/API/Element/setAttribute) विधि का उपयोग करके किसी तत्व की विशेषता के लिए बाध्यकारी बनाएं डोम ('element.setAttribute ('src', src)')। '[src]' किसी तत्व की प्रॉपर्टी पर बाध्यकारी बनाता है (बस इसे 'element.src = src' द्वारा सेट करें) – alexpods

+0

मुझे पूछना है ... आपने टेम्पलेट में '# प्लेयर' का उपयोग करने के बारे में कहां से सीखा, और फिर 'ViewChild ('player') 'का उपयोग कर इसका संदर्भ प्राप्त करने में सक्षम होना? (मुझे जो कुछ भी पढ़ रहे हैं उसे पढ़ने शुरू करना है, क्योंकि मुझे कोणीय दस्तावेज़ों में इस तरह की जानकारी नहीं मिल रही है। [व्यूचल्ड एपीआई पेज] (https://angular.io/docs/ts/latest/api/ कोर/ViewChild-var.html) यह समझा नहीं है।) –