Dokument.getElementById zastąpiono w angular4 / maszynopisie?

89

Tak więc pracuję z angular4 w mojej praktyce i to jest dla mnie nowość. Na szczęście aby pobrać elementy html i jego wartości użyłem <HTMLInputElement> document.getElementByIdlub <HTMLSelectElement> document.getElementById

Zastanawiam się, czy jest jakiś zamiennik tego w kątowym

Nino Gutierrez
źródło
2
Dlaczego nie skorzystać z getElementById?
Suren Srapyan
1
Dlaczego chcesz to zrobić?
Léo R.
Po prostu się zastanawiam, że istnieje kątowy sposób na uzyskanie elementów.
Nino Gutierrez

Odpowiedzi:

138

Możesz otagować swój element DOM za pomocą #someTag, a następnie pobrać go za pomocą @ViewChild('someTag').

Zobacz pełny przykład:

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.logwydrukuje jakiś tekst .

Alexandre Annic
źródło
Pojawia się błąd Błąd: nie można rozwiązać „@ angular / core / src / metadata / di” Błąd: nie można rozwiązać „@ angular / core / src / linker / element_ref”
Nino Gutierrez
2
nvm, rozwiązany przez importowanie w ten sposób. import {Component, OnInit, ViewChild, ElementRef} z '@ angular / core';
Nino Gutierrez
17
nie zadziała, jeśli masz warunkowy element dom, taki jak * ngFor, * ngIf itp.
Ravindra Thorat
Angular 8+ wymaga dwóch argumentów od dekoratora ViewChild.
Jak dodać #myDiv tylko wtedy, gdy warunek jest prawdziwy? Na przykład: z id i can do [id] = "isValid? 'MyDiv': ''. Thanks
daniel8x
77

Możesz po prostu wstrzyknąć token DOCUMENT do konstruktora i użyć na nim tych samych funkcji

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

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

Lub jeśli element, który chcesz pobrać, znajduje się w tym komponencie, możesz użyć odniesień do szablonów .

Suren Srapyan
źródło
24

Dla Angular 8 lub posterior @ViewChild mają dodatkowy parametr o nazwie opts, który ma dwie właściwości: read i static, read jest opcjonalne. Możesz go używać w ten sposób:

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

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

UWAGA: Static: false nie jest już wymagane w Angular 9. (tylko { static: true }wtedy, gdy zamierzasz użyć tej zmiennej wewnątrz ngOnInit)

Gustavo Santamaría
źródło
1
Działa, gdy dynamicznie ukrywasz lub pokazujesz elementy za pomocą *ngIf. Jak tworzysz ten element?
Gustavo Santamaría
7
  element: HTMLElement;

  constructor() {}

  fakeClick(){
    this.element = document.getElementById('ButtonX') as HTMLElement;
    this.element.click();
  }
Cesar Devesa
źródło
2
Jest to bardzo niebezpieczne (uruchomienie tego polecenia w Angular Universal powoduje awarię) i powinno być używane tylko wtedy, gdy żadna inna opcja nie jest możliwa (należy również wziąć pod uwagę, że element może nie być obecny)
Joniras
2
M @ Joniras, dlaczego jest to bardzo niebezpieczne?
Sumi Straessle
6

Spróbuj tego:

Kod pliku TypeScript:

(<HTMLInputElement> document.getElementById ("nazwa")). Wartość

Kod HTML:

 <input id = "name" type = "text" #name /> 
Swati
źródło