angle4 / typescriptのdocument.getElementById置換?


94

だから、私の練習ではangular4を使って作業していますが、これは私にとって新しいことです。幸いなことに、私が使用したhtml要素とその値を取得するために <HTMLInputElement> document.getElementByIdまたは <HTMLSelectElement> document.getElementById

角度でこれに代わるものがあるかどうか疑問に思っています


2
getElementByIdを使用しないのはなぜですか?
Suren Srapyan 2018年

要素を取得するための角度のある方法があるのだろうかと思っています。
ニノグティエレス

回答:


149

を使用してDOM要素にタグを付けてから、を使用して#someTag取得できます@ViewChild('someTag')

完全な例を参照してください。

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.logいくつかのテキストを印刷します


エラーアップエラーショー:ことはできません解決「@角度/コア/ SRC /メタデータ/ディ」エラー:することはできません解決「@角度/コア/ SRC /リンカー/ element_ref」
ニノグティエレス

2
nvm、このようにインポートすることで解決しました。import {Component、OnInit、ViewChild、ElementRef} from '@ angular / core';
ニノグティエレス

20
* ngFor、* ngIfなどの条件付きdom要素がある場合は機能しません
Ravindra Thorat 2018年

Angular 8+には、ViewChildデコレータに2つの引数が必要です。

条件が真の場合にのみ#myDivを追加するにはどうすればよいですか??たとえば:IDを持つ私は、[ID] = "はisValid 'myDiv'を行うことができます: ''感謝を。
daniel8x

77

DOCUMENTトークンをコンストラクターに挿入して、同じ関数を使用するだけです。

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

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

または、取得する要素がそのコンポーネントにある場合は、テンプレート参照を使用できます。


なぜドキュメントオブジェクトを挿入し、javascriptによって提供されるものを直接使用しない必要があるのですか?
ダビデ

@Davide私たちはAngularのシステムに依存しています。後で彼らは非常に良いことを実装し、実装をチェックすることができます。したがって、ここでは抽象化に依存しています
SurenSrapyan20年

24

Angular 8または後方の@ViewChildには、 optsと呼ばれる追加のパラメーターがあります。これにはreadとstaticの2つのプロパティがあり、readはオプションです。あなたはそれを次のように使うことができます:

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

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

注:静的:Angular 9ではfalseは不要になりました({ static: true }ngOnInit内でその変数を使用する場合のみ)


1
を使用して要素を動的に非表示または表示するときに機能します*ngIf。どのように要素を作成していますか?
グスタボ・サンタマリア

8

これを試して:

TypeScriptファイルコード:

(<HTMLInputElement> document.getElementById( "name"))。value

HTMLコード:

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

7
  element: HTMLElement;

  constructor() {}

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

4
これは非常に安全ではない(角ユニバーサルでこのコマンドを実行するとクラッシュする)と、他のオプションが不可能な場合にのみ(も要素が存在しないかもしれないことを考える)を使用する必要があります
Joniras

3
M @ Jonirasなぜそれは非常に危険なのですか?
SumiStraessle20年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.