document.getElementById заміна в angular4 / typecript?


90

Отже, я працюю з angular4 у своїй практичній роботі, і це нове для мене. На щастя, для того, щоб отримати елементи html та їх значення, я використовував <HTMLInputElement> document.getElementByIdабо <HTMLSelectElement> document.getElementById

Мені цікаво, чи є якась заміна для цього в кутовому


2
Чому б не використовувати getElementById?
Сурен Срапян,

1
Чому ти хочеш це зробити?
Лео Р.

Просто цікаво, є кутовий спосіб отримати елементи.
Ніно Гутьєррес

Відповіді:


139

Ви можете позначити свій елемент 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надрукує певний текст .


Помилка відображається Помилка: Не вдається вирішити '@ angular / core / src / metadata / di' Помилка: Не вдається вирішити '@ angular / core / src / linker / element_ref'
Ніно Гутьеррес

2
nvm, вирішено шляхом імпортування таким чином. імпортувати {Component, OnInit, ViewChild, ElementRef} з '@ angular / core';
Ніно Гутьєррес

17
це не буде працювати, якщо у вас є умовний елемент dom, такий як * ngFor, * ngIf тощо
Равіндра Торат,

Angular 8+ вимагає двох аргументів для декоратора ViewChild.

Як я можу додати #myDiv, лише якщо умова відповідає дійсності? Наприклад, за допомогою ідентифікатора я можу зробити [id] = "isValid? 'MyDiv': ''. Дякую
daniel8x,

78

Ви можете просто вколоти маркер ДОКУМЕНТ в конструктор і використовувати на ньому ті самі функції

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

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

Або якщо елемент, який ви хочете отримати, знаходиться в цьому компоненті, ви можете використовувати посилання на шаблони .


24

Для Angular 8 або posterior @ViewChild є додатковий параметр, який називається opts, який має дві властивості: читання та статичність, читання є необов’язковим. Ви можете використовувати його так:

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

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

ПРИМІТКА: Статичний: false більше не потрібно в Angular 9. (саме { static: true }тоді, коли ви збираєтесь використовувати цю змінну всередині ngOnInit)


1
Це працює, коли ви динамічно приховуєте або показуєте елементи за допомогою *ngIf. Як ви створюєте елемент?
Густаво Сантамарія,

7
  element: HTMLElement;

  constructor() {}

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

2
Це дуже небезпечно (запуск цієї команди в Angular Universal спричиняє збій) і повинен використовуватися лише в тому випадку, якщо жоден інший варіант неможливий (також враховуйте, що елемент може бути відсутній)
Джонірас,

2
M @ Joniras, чому це дуже небезпечно?
Сумі Штрассле

6

Спробуйте це:

Код файлу TypeScript:

(<HTMLInputElement> document.getElementById ("ім'я")). Значення

HTML-код:

 <input id = "name" type = "text" #name /> 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.