angular4 / typescript'te document.getElementById değişimi?


95

Bu yüzden, pratik çalışmalarımda angular4 ile çalışıyorum ve bu benim için yeni. Şans eseri, html öğelerini ve değerlerini almak için kullandığım <HTMLInputElement> document.getElementByIdveya <HTMLSelectElement> document.getElementById

Bunun için açısal olarak herhangi bir alternatif olup olmadığını merak ediyorum


2
Neden getElementById kullanılmıyor?
Suren Srapyan

Öğeleri almanın açısal bir yolu olduğunu merak ediyorum.
Nino Gutierrez

Yanıtlar:


151

DOM öğenizi kullanarak etiketleyebilir #someTag, ardından ile alabilirsiniz @ViewChild('someTag').

Tam örneğe bakın:

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.logBir metin yazdıracak .


Hata ortaya çıkıyor Hata: '@ angular / core / src / metadata / di' çözülemiyor 'Hata: Çözülemiyor' @ angular / core / src / linker / element_ref '
Nino Gutierrez

2
nvm, bu şekilde içe aktararak çözüldü. '@ angular / core'dan {Component, OnInit, ViewChild, ElementRef} içe aktarın;
Nino Gutierrez

20
* ngFor, * ngIf vb. gibi koşullu dom öğeniz varsa çalışmaz
Ravindra

Angular 8+ , ViewChild dekoratörüne iki argüman gerektirir .

#MyDiv'i yalnızca bir koşul doğruysa nasıl ekleyebilirim? Örneğin: id ile yapabilirim [id] = "isValid? 'MyDiv':". Teşekkürler
daniel8x

77

DOCUMENT belirtecini yapıcıya enjekte edebilir ve üzerinde aynı işlevleri kullanabilirsiniz.

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

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

Veya almak istediğiniz öğe bu bileşendeyse, şablon referanslarını kullanabilirsiniz .


Neden belge nesnesini enjekte etmeliyim ve javascript tarafından sağlananları doğrudan kullanmamalıyım?
Davide

@Davide, Angular sistemine güveniyoruz. Daha sonra çok iyi şeyler uygulayabilir ve bunların uygulanmasında bazı kontroller yapabilirler. Bu yüzden buradaki soyutlamaya güveniyoruz
Suren Srapyan

24

Angular 8 veya posterior @ViewChild için opts adında iki özelliğe sahip ek bir parametre vardır : okuma ve statik, okuma isteğe bağlıdır. Bunu şu şekilde kullanabilirsiniz:

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

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

NOT: Statik: false artık Angular 9'da gerekli değildir (yalnızca { static: true } da bu değişkeni ngOnInit içinde kullanacağınız zaman)


1
Kullanarak öğeleri dinamik olarak gizlediğinizde veya gösterdiğinizde çalışır *ngIf. Öğeyi nasıl yaratıyorsun?
Gustavo Santamaría

8

Bunu dene:

TypeScript dosya kodu:

(<HTMLInputElement> document.getElementById ("name")). Değer

HTML Kodu:

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

7
  element: HTMLElement;

  constructor() {}

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

4
Bu çok güvensizdir (bu komutu Angular Universal'da çalıştırmak çökmeye neden olur) ve yalnızca başka bir seçenek mümkün olmadığında kullanılmalıdır (öğenin mevcut olmayabileceğini de göz önünde bulundurun)
Joniras

3
M @ Joniras neden çok güvensiz?
Sumi Straessle
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.