2016-03-04 32 views
6

Aggiornamento nel 2017: ViewChild sarà il modo migliore per accedere all'elemento Dom.Angular2 + Typescript: come manipolare l'elemento DOM?

Domanda scritto nel 2016:

Ho provato i seguenti due metodi, unico metodo 2 opere. Ma non voglio il codice ripetuto: document.getElementById() in ogni metodo. Preferisco il metodo 1, ma perché il metodo 1 non funziona?

Esistono modi migliori per manipolare DOM in Angular2?

file HTML:

<video id="movie" width="480px" autoplay> 
    <source src="img/movie.mp4" type="video/mp4"> 
    Your browser does not support the video tag. 
</video> 

Metodo 1:

... 
class AppComponent { 
    videoElement = document.getElementById("movie"); 

    playVideo() { 
     this.videoElement.play(); 
    } 
} 

Metodo 2:

... 
class AppComponent { 

    playVideo() { 
     var videoElement = document.getElementById("movie"); 
     videoElement.play(); 
    } 
} 
+0

ciò che si vuole un sk? pubblicare un po 'di codice o plunkr se possibile. sembra che entrambi i metodi che hai pubblicato abbiano fatto lo stesso vero? –

+0

So che sembra uguale per le variabili, ma in realtà per l'elemento DOM, c'è una differenza tra la dichiarazione di una variabile di elemento DOM all'interno del metodo e il metodo esterno. Sembra molto strano, ma ottengo questa conclusione dopo il primo metodo fallito. –

+0

quali sono le conclusioni che hai ottenuto? c'è qualche grande differenza tra questi due? se sì fornire come risposta può essere utile per gli altri. –

risposta

9
<div #itemId>{{ (items()) }}</div> 

È possibile accedere all'elemento via ViewChild:

import {ViewChild} from '@angular/core'; 

    @ViewChild('itemId') itemId; 

    ngAfterViewInit() { 
     console.log(this.itemId.nativeElement.value); 
    } 
0

Secondo la vostra domanda che si desidera utilizzare una parte comune di codice in più metodi. ma non hai avuto successo. solo dichiarare una singola variabile ed assegnare alcuni valori per la variabile allora sarà possibile utilizzare tale variabile in metodi diversi come questa o possiamo dire bind questo valore variabile con rilegatura due dati via della angolare utilizzando [(ngModel)]:

class A { 
     abc:string = null; 
     abc2:string = null; 

     abcFun(){ 
     console.log(this.abc) 
     } 

     bcdFun(){ 
     console.log(this.abc) 
     } 

     // second method using javascript as your way 
      abcFun2(){ 
      this.abc2 = document.getElementById('abc2').value; 
      console.log(this.abc2); 
      } 
      bcdFun2(){ 
      console.log(this.abc2); 
      } 
    } 

<input type="text" id="abc" [(ngModel)]="abc"> {{abc}} 

<button (click)="abcFun()">ABC FUN</button> 
<button (click)="bcdFun()">BCD FUN</button> 


<input type="text" id="abc2"> {{abc2}} 

<button (click)="abcFun2()">ABC FUN</button> 
<button (click)="bcdFun2()">BCD FUN</button> 

ecco demo funzionante per lo stesso http://plnkr.co/edit/Y80SsPCUTx1UP5tYksIy?p=preview

+0

Ho provato il tuo codice sopra, non funziona neanche. Lo hai mai provato? –

+0

per favore guarda ora la demo funzionante allegata al link. puoi anche utilizzare il bind dei dati bidirezionali. –

+0

Grazie per il vostro aiuto. Scusa se ho avuto problemi nel creare un'applicazione angular2 su Plunker e non posso modificare il tuo codice su Plunker. Ma ho aggiornato il codice sopra. Hai frainteso la mia domanda. La mia domanda riguarda la manipolazione del DOM attraverso document.getElementById(). Perché voglio riprodurre/mettere in pausa il video, devo ottenere l'elemento. Il fatto è che se ho definito la variabile videoElement al di fuori dei metodi è diverso dal metodo definito all'interno. Il primo metodo riceverà un errore, non possiamo accedere all'elemento DOM quando è definito al di fuori del metodo. Puoi concedermi il diritto di modificare il tuo plunker? –

Problemi correlati