document.getElementById pengganti di angular4 / typescript?

90

Jadi, saya bekerja dengan angular4 dalam pekerjaan praktik saya dan ini baru bagi saya. Untungnya, untuk mendapatkan elemen html dan nilainya saya menggunakan <HTMLInputElement> document.getElementByIdatau <HTMLSelectElement> document.getElementById

Saya bertanya-tanya apakah ada pengganti untuk ini di sudut

Nino Gutierrez
sumber
2
Mengapa tidak menggunakan getElementById?
Suren Srapyan
1
Mengapa Anda ingin melakukan ini?
Léo R.
Hanya bertanya-tanya apakah ada cara bersudut untuk mendapatkan elemen.
Nino Gutierrez

Jawaban:

138

Anda dapat menandai elemen DOM Anda menggunakan #someTag, lalu mendapatkannya dengan @ViewChild('someTag').

Lihat contoh lengkapnya:

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.logakan mencetak Beberapa teks .

Alexandre Annic
sumber
Kesalahan muncul Kesalahan: Tidak dapat menyelesaikan '@ angular / core / src / metadata / di' Kesalahan: Tidak dapat menyelesaikan '@ angular / core / src / linker / element_ref'
Nino Gutierrez
2
nvm, diselesaikan dengan mengimpor seperti ini. impor {Component, OnInit, ViewChild, ElementRef} dari '@ angular / core';
Nino Gutierrez
17
itu tidak akan berfungsi jika Anda memiliki elemen dom bersyarat seperti * ngFor, * ngIf dll
Ravindra Thorat
Angular 8+ membutuhkan dua argumen untuk dekorator ViewChild.
Bagaimana cara menambahkan #myDiv hanya jika kondisinya benar? Sebagai Contoh: dengan id saya dapat melakukan [id] = "isValid? 'MyDiv': ''. Terima kasih
daniel8x
78

Anda cukup memasukkan token DOKUMEN ke dalam konstruktor dan menggunakan fungsi yang sama di dalamnya

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

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

Atau jika elemen yang ingin Anda dapatkan ada di dalam komponen itu, Anda bisa menggunakan referensi template .

Suren Srapyan
sumber
24

Untuk Angular 8 atau posterior @ViewChild memiliki parameter tambahan yang disebut opts, yang memiliki dua properti: read dan static, read adalah opsional. Anda dapat menggunakannya seperti ini:

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

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

CATATAN: Statis: false tidak diperlukan lagi di Angular 9. (hanya { static: true }ketika Anda akan menggunakan variabel itu di dalam ngOnInit)

Gustavo Santamaría
sumber
1
Ini berfungsi saat Anda secara dinamis menyembunyikan atau menampilkan elemen menggunakan *ngIf. Bagaimana Anda membuat elemen?
Gustavo Santamaría
7
  element: HTMLElement;

  constructor() {}

  fakeClick(){
    this.element = document.getElementById('ButtonX') as HTMLElement;
    this.element.click();
  }
Cesar Devesa
sumber
2
Ini sangat tidak aman (menjalankan perintah ini di Angular Universal menyebabkan crash) dan sebaiknya hanya digunakan jika tidak ada opsi lain yang memungkinkan (pertimbangkan juga bahwa elemen tersebut mungkin tidak ada)
Joniras
2
M @ Joniras mengapa sangat tidak aman?
Sumi Straessle
6

Coba ini:

Kode file TypeScript:

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

Kode HTML:

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