angular4/typescript中的document.getElementById替换?

Nin*_*rez 53 typescript angular

所以,我在练习中使用angular4,这对我来说是新的.幸运的是,为了获得我使用的html元素及其值 <HTMLInputElement> document.getElementById<HTMLSelectElement> document.getElementById

我想知道是否有角度更换

Ale*_*nic 89

您可以使用标记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);
    }
}
Run Code Online (Sandbox Code Playgroud)

console.log将打印一些文字.

  • 如果您有条件dom元素(如* ngFor,* ngIf等),它将无法正常工作 (6认同)
  • nvm,通过这样导入解决。从'@ angular / core'导入{Component,OnInit,ViewChild,ElementRef}; (2认同)
  • @RavindraThorat 在 Angular 8+ 中,您可以提供 `{static: false}` 作为 ViewChild 装饰器的第二个参数,每当该项目可见时,您的引用就会指向它。 (2认同)

Sur*_*yan 51

您可以将DOCUMENT标记注入构造函数并在其上使用相同的函数

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

@Component({...})
export class AppCmp {
   constructor(@Inject(DOCUMENT) document) {
      document.getElementById('el');
   }
}
Run Code Online (Sandbox Code Playgroud)

或者,如果要获取的元素位于该组件中,则可以使用模板引用.

  • @Davide,我们依赖 Angular 系统。稍后他们可以实现非常好的事情并对其实施进行一些检查。所以我们这里只依赖抽象 (3认同)
  • 为什么我应该注入文档对象而不是直接使用javascript提供的对象? (2认同)

Swa*_*ati 10

尝试这个:

打字稿文件代码:

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

HTML代码:

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

  • 请描述您使用 getElementById("name") 引用的“name”属性或值,因为它可以是 id 或 #name (5认同)

小智 7

  element: HTMLElement;

  constructor() {}

  fakeClick(){
    this.element = document.getElementById('ButtonX') as HTMLElement;
    this.element.click();
  }
Run Code Online (Sandbox Code Playgroud)

  • M@Joniras 为什么很不安全? (5认同)
  • 这是非常不安全的(在 Angular Universal 中运行这个命令会导致崩溃),只有在没有其他选项时才应该使用(还要考虑元素可能不存在) (4认同)

Gus*_*ría 6

对于Angular 8或后置@ViewChild,还有一个名为opts 的附加参数,它具有两个属性:read和static,read是可选的。您可以这样使用它:

@ViewChild('mydiv', { static: false }) mydiv: ElementRef;
Run Code Online (Sandbox Code Playgroud)

请注意,这适用于Angular 8或后角。

  • 感谢您提供更新的语法。值得注意的是,在 Angular 8 中,您仍然不能仅通过使用`@ViewChild('myDiv'...` 的标签名称来获取任何 HTML 元素。您只能获取组件标记中用模板变量标记的元素,例如`#mydiv`。我几乎错过了您的答案包含元素上的变量标签。 (2认同)