Thay thế document.getElementById trong angle4 / stylescript?


90

Vì vậy, tôi đang làm việc với angle4 trong công việc thực hành của mình và đây là điều mới mẻ đối với tôi. Thật may mắn, để có được các phần tử html và các giá trị của nó, tôi đã sử dụng <HTMLInputElement> document.getElementByIdhoặc <HTMLSelectElement> document.getElementById

Tôi tự hỏi nếu có bất kỳ sự thay thế nào cho điều này trong góc cạnh


2
Tại sao không sử dụng getElementById?
Suren Srapyan

1
Tại sao bạn muốn làm điều này?
Léo R.

Chỉ tự hỏi rằng có một cách góc cạnh để có được các phần tử.
Nino Gutierrez

Câu trả lời:


139

Bạn có thể gắn thẻ phần tử DOM của mình bằng cách sử dụng #someTag, sau đó lấy nó bằng @ViewChild('someTag').

Xem ví dụ đầy đủ:

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.logsẽ in Một số văn bản .


Lỗi chương trình lên Lỗi: Không thể quyết tâm '@ góc / lõi / src / siêu dữ liệu / di' Lỗi: Không thể quyết tâm '@ góc / lõi / src / linker / element_ref'
Nino Gutierrez

2
nvm, được giải quyết bằng cách nhập như thế này. nhập {Component, OnInit, ViewChild, ElementRef} từ '@ angle / core';
Nino Gutierrez

17
nó sẽ không hoạt động nếu bạn có yếu tố dom có điều kiện như * ngFor, * ngIf vv
Ravindra Thorat

Angular 8+ yêu cầu hai đối số cho trình trang trí ViewChild.

Làm cách nào để chỉ thêm #myDiv nếu một điều kiện là đúng? Ví dụ: với id tôi có thể làm [id] = "isValid? 'MyDiv': ''. Cảm ơn
daniel8x

78

Bạn chỉ có thể đưa mã thông báo DOCUMENT vào hàm tạo và sử dụng các chức năng tương tự trên đó

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

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

Hoặc nếu phần tử bạn muốn lấy nằm trong thành phần đó, bạn có thể sử dụng tham chiếu mẫu .


24

Đối với Angular 8 hoặc sau @ViewChild có một tham số bổ sung được gọi là opts, có hai thuộc tính: đọc và tĩnh, đọc là tùy chọn. Bạn có thể sử dụng nó như vậy:

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

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

LƯU Ý: Static: false không còn được yêu cầu trong Angular 9. (chỉ { static: true }khi bạn định sử dụng biến đó bên trong ngOnInit)


1
Nó hoạt động khi bạn ẩn hoặc hiện động các phần tử bằng cách sử dụng *ngIf. Bạn đang tạo phần tử như thế nào?
Gustavo Santamaría

7
  element: HTMLElement;

  constructor() {}

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

2
Điều này rất không an toàn (chạy lệnh này trong góc Phổ gây ra một vụ tai nạn) và chỉ nên được sử dụng nếu không có lựa chọn nào khác là có thể (cũng xem xét rằng nguyên tố này có thể không có mặt)
Joniras

2
M @ Joniras tại sao nó rất không an toàn?
Sumi Straessle

6

Thử đi:

Mã tệp TypeScript:

(<HTMLInputElement> document.getElementById ("name")). Giá trị

Mã HTML:

 <input id = "name" type = "text" #name /> 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.