通过 id 获取元素 - Angular2

Posted

技术标签:

【中文标题】通过 id 获取元素 - Angular2【英文标题】:Get element by id - Angular2 【发布时间】:2017-05-26 02:54:48 【问题描述】:

我有一个代码:

document.getElementById('loginInput').value = '123';

但是在编译代码时我收到以下错误:

类型 htmlElement 上不存在属性值。

我已经声明了一个变量:value: string;

如何避免此错误?

谢谢。

【问题讨论】:

似乎你确实想要一个 id 的组件,而不是 id 的元素。但这不受支持。 提供更多代码 @GünterZöchbauer 那么我怎样才能捕捉到这个元素呢? <input type='text' id='loginInput'/>? 如果你使用 Angular 2,你可以使用它的数据绑定功能here 别那样做,只要按照 angular.io 的绑定教程... 那里有很多例子 【参考方案1】:

如果您想设置值,则可以在单击或某些事件触发时的某些功能中执行相同的操作。

您也可以使用ViewChild 使用像这样的局部变量来获取价值

<input type='text' id='loginInput' #abc/>

并获得这样的价值

this.abc.nativeElement.value

here is working example

更新

好的,你必须使用angualr2的ngAfterViewInit方法来做同样的事情

ngAfterViewInit()
    document.getElementById('loginInput').value = '123344565';
  

ngAfterViewInit 不会抛出任何错误,因为它会在模板加载后呈现

【讨论】:

有趣。在 Angular 6 中是这样吗? 是的。 Angular 6 也是如此。 这是 Angular 中的首选方式吗?它也适用于 Angular 7,但我不确定这是否是 Angular 的方法。 显然不是@skydev,但根据问题要求我回答了这个【参考方案2】:
(<HTMLInputElement>document.getElementById('loginInput')).value = '123';

Angular 不能直接获取 HTML 元素,因此您需要通过将上述泛型绑定到它来指定元素类型。

更新::

这也可以使用带有 #localvariable 的 ViewChild 来完成,如此处所示,如 here 中所述

<textarea  #someVar  id="tasknote"
                  name="tasknote"
                  [(ngModel)]="taskNote"
                  placeholder=" notePlaceholder "
                  style="background-color: pink"
                  (blur)="updateNote() ; noteEditMode = false " (click)="noteEditMode = false">  todo.note  

</textarea>

import ElementRef,Renderer2 from '@angular/core';
@ViewChild('someVar') el:ElementRef;

constructor(private rd: Renderer2) 

ngAfterViewInit() 
      console.log(this.rd); 
      this.el.nativeElement.focus();      //<<<=====same as oldest way


【讨论】:

【参考方案3】:

另一种方法,即:您可以使用“Angular 方式”并使用ngModel 并完全跳过document.getElementById('loginInput').value = '123';。而是:

<input type="text" [(ngModel)]="username"/>
<input type="text" [(ngModel)]="password"/>

并在您的组件中给出这些值:

username: 'whatever'
password: 'whatever'

这将在导航到页面时预设用户名和密码。

【讨论】:

如果我必须将值从外部 javascript 文件传递​​到角度组件表单字段怎么办?这就是我所做的,当算法完成生成值时,我有一个算法位于 javascript 文件中,并使用此代码 getDocumentById('input').value = someValue; 传递回角度形式。 .但是,当我尝试在 OnSubmit() 事件中检索值时,我得到了未定义的值。有什么想法吗?【参考方案4】:

Complate Angular Way (Set/Get value by Id):

//在Html标签中

 <button (click) ="setValue()">Set Value</button>
 <input type="text"  #userNameId />

//在组件.ts文件中

    export class testUserClass 
       @ViewChild('userNameId') userNameId: ElementRef;

      ngAfterViewInit()
         console.log(this.userNameId.nativeElement.value );
       

      setValue()
        this.userNameId.nativeElement.value = "Sample user Name";
      



   

【讨论】:

以上是关于通过 id 获取元素 - Angular2的主要内容,如果未能解决你的问题,请参考以下文章

viewChild如何获取angular2中用js添加的元素?

如何在Angular2中获取(DOM)元素的宽度

Angular2如何获取动态生成的HTML元素的引用

如何通过选择器访问 DOM 元素

如何在Angular2中使用Observable通过id查找数组的元素

Angular 2+:获取@ViewChild() 的子元素