document.getElementById sostituzione in angular4 / typescript?


95

Quindi, sto lavorando con angular4 nel mio lavoro pratico e questo è nuovo per me. Fortunatamente, per ottenere elementi html e i suoi valori ho usato <HTMLInputElement> document.getElementByIdo <HTMLSelectElement> document.getElementById

Mi chiedo se ci sia qualche sostituto per questo in angolare


2
Perché non utilizzare getElementById?
Suren Srapyan

Mi chiedo solo che esista un modo angolare per ottenere elementi.
Nino Gutierrez

Risposte:


151

Puoi taggare il tuo elemento DOM utilizzando #someTag, quindi ottenerlo con @ViewChild('someTag').

Vedi esempio completo:

import {AfterViewInit, Component, ElementRef, ViewChild} from '@angular/core';

@Component({
    selector: 'app',
    template: `
        <div #myDiv>Some text</div>
    `,
})
export class AppComponent implements AfterViewInit {
    @ViewChild('myDiv') myDiv: ElementRef;

    ngAfterViewInit() {
        console.log(this.myDiv.nativeElement.innerHTML);
    }
}

console.logstamperà del testo .


Errore visualizzato Errore: Impossibile risolvere "@ angular / core / src / metadata / di" Errore: Impossibile risolvere "@ angular / core / src / linker / element_ref"
Nino Gutierrez

2
nvm, risolto importando in questo modo. importa {Component, OnInit, ViewChild, ElementRef} da '@ angular / core';
Nino Gutierrez

20
non funzionerà se hai un elemento dom condizionale come * ngFor, * ngIf ecc
Ravindra Thorat

Angular 8+ richiede due argomenti al decoratore ViewChild.

Come posso aggiungere #myDiv solo se una condizione è vera? Ad esempio: con id posso fare [id] = "isValid? 'MyDiv':" ". Grazie
daniel8x

77

Puoi semplicemente iniettare il token DOCUMENT nel costruttore e utilizzare le stesse funzioni su di esso

import { Inject }  from '@angular/core';
import { DOCUMENT } from '@angular/common'; 

@Component({...})
export class AppCmp {
   constructor(@Inject(DOCUMENT) document) {
      document.getElementById('el');
   }
}

Oppure, se l'elemento che desideri ottenere è in quel componente, puoi utilizzare i riferimenti ai modelli .


Perché dovrei iniettare l'oggetto documento e non utilizzare direttamente quello fornito da javascript?
Davide

@Davide ci affidiamo al sistema di Angular. Successivamente possono implementare cose molto buone e fare un po 'di controllo nella loro implementazione. Quindi ci basiamo solo sull'astrazione qui
Suren Srapyan

24

Per Angular 8 o posterior @ViewChild hai un parametro aggiuntivo chiamato opts, che ha due proprietà: read e static, read è opzionale. Puoi usarlo in questo modo:

// ...
@ViewChild('mydiv', { static: false }) public mydiv: ElementRef;

constructor() {
// ...
<div #mydiv></div>

NOTA: Statico: false non è più richiesto in Angular 9. (solo { static: true }quando utilizzerai quella variabile all'interno di ngOnInit)


1
Funziona quando nascondi o mostri dinamicamente gli elementi usando *ngIf. Come stai creando l'elemento?
Gustavo Santamaría

8

Prova questo:

Codice file TypeScript:

(<HTMLInputElement> document.getElementById ("name")). Value

Codice HTML:

 <input id = "name" type = "text" #name /> 

7
  element: HTMLElement;

  constructor() {}

  fakeClick(){
    this.element = document.getElementById('ButtonX') as HTMLElement;
    this.element.click();
  }

4
Questo è molto pericoloso (l'esecuzione di questo comando in Angular Universal causa un arresto anomalo) e dovrebbe essere utilizzato solo se non è possibile nessun'altra opzione (considera anche che l'elemento potrebbe non essere presente)
Joniras

3
M @ Joniras perché è molto pericoloso?
Sumi Straessle
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.