document.getElementById-Ersatz in angle4 / typescript?


90

Also arbeite ich mit angular4 in meiner Übungsarbeit und das ist neu für mich. Zum Glück habe ich <HTMLInputElement> document.getElementByIdoder verwendet, um HTML-Elemente und ihre Werte zu erhalten <HTMLSelectElement> document.getElementById

Ich frage mich, ob es einen Ersatz dafür in Winkel gibt


2
Warum nicht getElementById verwenden?
Suren Srapyan

1
Warum willst du das tun?
Léo R.

Ich frage mich nur, ob es einen eckigen Weg gibt, um Elemente zu erhalten.
Nino Gutierrez

Antworten:


138

Sie können Ihr DOM-Element mit markieren #someTagund dann mit abrufen @ViewChild('someTag').

Siehe vollständiges Beispiel:

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.logdruckt Text .


Fehler wird angezeigt Fehler: '@ angle / core / src / metadata / di' kann nicht aufgelöst werden Fehler: '@ angle / core / src / linker / element_ref' kann nicht aufgelöst werden
Nino Gutierrez

2
nvm, gelöst durch so importieren. {Component, OnInit, ViewChild, ElementRef} aus '@ angle / core' importieren;
Nino Gutierrez

17
Es wird nicht funktionieren, wenn Sie ein bedingtes Dom-Element wie * ngFor, * ngIf usw. haben
Ravindra Thorat

Für Angular 8+ sind zwei Argumente für den ViewChild-Dekorator erforderlich .

Wie kann ich #myDiv nur hinzufügen, wenn eine Bedingung erfüllt ist? Zum Beispiel: mit id kann ich [id] = "isValid? 'MyDiv': ''. Danke
daniel8x

78

Sie können einfach das DOCUMENT- Token in den Konstruktor einfügen und dieselben Funktionen darauf verwenden

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

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

Wenn sich das gewünschte Element in dieser Komponente befindet, können Sie Vorlagenreferenzen verwenden .


24

Für Angular 8 oder posterior @ViewChild gibt es einen zusätzlichen Parameter namens opts, der zwei Eigenschaften hat: read und static, read ist optional. Sie können es so verwenden:

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

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

HINWEIS: Statisch: false ist in Angular 9 nicht mehr erforderlich (nur { static: true } wenn Sie diese Variable in ngOnInit verwenden möchten).


1
Dies funktioniert, wenn Sie Elemente mithilfe von dynamisch ausblenden oder anzeigen *ngIf. Wie erstellen Sie das Element?
Gustavo Santamaría

7
  element: HTMLElement;

  constructor() {}

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

2
Dies ist sehr unsicher (das Ausführen dieses Befehls in Angular Universal führt zu einem Absturz) und sollte nur verwendet werden, wenn keine andere Option möglich ist (berücksichtigen Sie auch, dass das Element möglicherweise nicht vorhanden ist)
Joniras

2
M @ Joniras warum ist es sehr unsicher?
Sumi Straessle

6

Versuche dies:

TypeScript-Dateicode:

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

HTML Quelltext:

 <input id = "name" type = "text" #name /> 
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.