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


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 .


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 .


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)


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();
  }

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 /> 
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.