等效于角度的 getElementsByTagName

Posted

技术标签:

【中文标题】等效于角度的 getElementsByTagName【英文标题】:Equivalent of getElementsByTagName in angular 【发布时间】:2018-06-22 07:51:41 【问题描述】:

我正在尝试在一个网页中选择所有 textarea

有没有办法在一个查询中获取所有这些元素并循环遍历它们以使用Renderer2renderer.listen 为每个元素添加一个侦听器,以便在我添加文本时实现vertical auto expand of the textarea

如果我使用@viewchild,我必须为它们中的每一个手动添加一个不同的模板引用变量。

是否有可能在角度上有类似于 getElementsByTagName 的东西并避免直接访问 DOM ?

【问题讨论】:

【参考方案1】:

指令是您的方案的完美案例。

这不是最终的实现,但应该让您很好地了解如何使用它。

import  Directive  from '@angular/core';

@Directive(
  selector: 'textarea[resize]'
)
export class HighlightDirective 

  @HostBinding('style.height.px') 
  height: number;

  @HostListener('change') 
  @HostListener('cut')
  @HostListener('paste')
  @HostListener('drop')
  @HostListener('keydown') 
  onClicked(event: Event) 
    this.resize();
  

  constructor(private elementRef: ElementRef) 

  resize() 
    const textArea = this.elementRef.nativeElement as htmlTextAreaElement;
    this.height = textArea.scrollHeight;
  

在你的模板中装饰你的textarea:

<textarea resize></textarea>

【讨论】:

我认为您正在使用对 Dom 的直接访问?但会看的。 (HostBinding 的修订答案)ElementRef 让您可以访问 DOM 中的本机元素,在这种情况下,您需要它,因为 Angular 当前为 cannot read DOM properties。 最初滚动条是可见的,所以我添加了overflow-y:hidden,但现在我必须计算textarea 内的初始行数以设置行数的初始值.. . 否则会有很多行被隐藏。 这个指令看起来不错,只是第一次在textarea 中输入上一行时出现的一个小问题,有点上,每当我删除一行或删除一个字母时,上一行完全显示在里面,不知道为什么,可能是我们必须捕获鼠标向下或其他东西......但我也添加了overflow-y: hidden,否则我一直看到滚动 好像加上@HostListener('keyup') onkeyup(event: Event) this.resize(); 会好一点。

以上是关于等效于角度的 getElementsByTagName的主要内容,如果未能解决你的问题,请参考以下文章

C# 等效于 Java 标点正则表达式

NSTimer 等效于 Javascript

linq 等效于通用函数的'select *' sql?

等效于 Riverpod 中的 ChangeNotifierProvider 小部件

jQuery 等效于 JavaScript 的 addEventListener 方法

等效于 Linux 上的 GetTickCount()