【问题标题】:Angular2 retrieve all elements with class nameAngular2 检索所有具有类名的元素
【发布时间】:2017-04-12 17:32:59
【问题描述】:

任何人都可以帮助如何在 Angular 2 中找到具有特定类名的“所有”元素吗?我认为这将是微不足道的,但它给了我更多准备好的问题。

<span class="classImLookingFor">foo</span>
<span class="classImLookingFor">Voo</span>
<span class="classImLookingFor">Moo</span>

我认为通过执行下面的操作将返回所有具有类“classImLookingFor”的元素,但它只返回第一个实例。

constructor(private renderer: Renderer){}
ngAfterViewInit(){
 const el = this.renderer.selectRootElement('.classImLookingFor');
 this.renderer.setElementAttribute(el, 'tabindex', 0);
}

之后,我的标记看起来像这样。

<span class="classImLookingFor" tabindex="0">foo</span>
<span class="classImLookingFor">Voo</span>
<span class="classImLookingFor">Moo</span>

似乎我应该能够创建一个渲染器数组,但这似乎也不起作用。我需要使用该类名操作每个元素。提前致谢

【问题讨论】:

  • 你可以使用document.querySelectorAll('.classImLookingFor')
  • 正是我想要的。这很完美。但由于某种原因,document.getElementsByClassName 对我不起作用。感谢您的快速响应。我把它弄得太复杂了
  • 你能支持我的回答,因为它对你有帮助吗

标签: angular renderer


【解决方案1】:

这不是返回 DOM 中的所有元素吗?有没有办法只返回由我“在”中的 Angular 组件生成的元素?

你需要……

  1. constructor中注入ElementRef

    constructor(private renderer: Renderer, private elem: ElementRef){}
    
  2. 使用querySelectorAll api 查找您正在搜索的元素。

    ngAfterViewInit(){
        // you'll get your through 'elements' below code
        let elements = this.elem.nativeElement.querySelectorAll('.classImLookingFor');
    }
    

The answer @Aravind 提供的性能并不是最好的,因为它会搜索整个 DOM。

这个解决方案只会搜索当前组件内的 DOM。

【讨论】:

  • 这是在 Angular 中获取渲染 (querySelectorAll) 值的实际方法
  • 对我不起作用。使用 document 按预期工作,但这种方法没有。不幸的是,我可以看到这样做的好处。
  • @JeneralJames,我认为它不适合你,因为你在 elementRef 之外搜索元素,而 this.elem.nativeElement.querySelectorAll 只在其中搜索。
【解决方案2】:

Angular 10+ 文档与 SSR 的兼容性,导入:

import { DOCUMENT } from '@angular/common'

然后注入:

constructor(@Inject(DOCUMENT) private _document: HTMLDocument) {
    }

并像这样在您的组件/指令中使用:

doSomething(): void {
 this._document.querySelectorAll('.classImLookingFor')
}

【讨论】:

    【解决方案3】:

    在评论对 OP 有效时回答。

    你应该使用

    document.querySelectorAll('.classImLookingFor')
    

    【讨论】:

    • 这不是返回 DOM 中的所有元素吗?有没有办法只返回由我“在”中的 Angular 组件生成的元素?
    • @SkorunkaFrantišek,你是对的,检查this answer
    • 我投了赞成票,因为如果你想在文档中引用你所在的 Angular 组件之外的元素,这很有用。
    【解决方案4】:

    有多种方法可以做,但 Angular 9+ 版本提供的最新方法是:

    1.import Inject and DOCUMENT in angular。

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

    2.然后在所需类的构造函数中创建一个引用。

    constructor(@Inject(DOCUMENT) private _document: HTMLDocument) {}
    

    3.用作所有可用javascript方法的变量。

    selectElement(): void {
     this._document.querySelector('#mySelectedId');
    }
    

    【讨论】:

    • 使用这个DOCUMENT的angular/common和native document有什么好处。*?
    【解决方案5】:

    这对于您的用例来说可能有点过于简单化了,但是您有什么理由不能像这样使用本机 DOM 函数吗?

    var domRepresentation = document.getElementsByClassName('classImLookingFor');
    var angularElement = angular.element(domRepresentation);
    

    【讨论】:

    • 评论修改版
    • 我第一次读到这篇文章时就看过去了,对此感到抱歉。
    • 我对 Stack Overflow 很陌生,看到有 0 个答案。最好先发表评论而不是直接回答问题@Aravind?
    • angular 来自哪里?是 AngularJS 还是 Angular2+?
    【解决方案6】:

    你需要在 Angular 中使用 DOM

    var element=document.getElementsByClassName("X").item(0);
    

    它对我有用!

    【讨论】:

    • 可能适用于 AngularJS,不适用于 Angular 2+
    • 你不应该像那样直接访问 DOM,它破坏了 Angular 对平台的抽象。使用 ViewChild 和/或 Renderer2。
    猜你喜欢
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    相关资源
    最近更新 更多