如何在Angular中快速定位DOM元素

栏目: 编程语言 · AngularJS · 发布时间: 6年前

内容简介:如何在Angular中快速定位DOM元素

如何在Angular中快速定位DOM元素

在使用Angular2+中,经常会想快速的去选择DOM上的某个元素,如果是刚上手Angular,有可能直接就使用原生DOM操作或者导入jQuery再进行DOM操作,既然都使用了Angular了,有没有更好的方法呢?答案是肯定的。

通过ElementRef

先上代码:

import {Component, ElementRef, OnInit} from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit{
  color:string;
  title = 'button !';

  constructor(privateel:ElementRef){}

  setHeight(){
    this.el.nativeElement.querySelector('.btn1').style.height = '300px';
  }

  ngOnInit(){
    this.setHeight();
  }

}
<h1>
  {{title}}
</h1>
<div>
<buttonmyHighlightclass="btn btn1">按钮一</button>
<buttonmyHighlightclass="btn">按钮二</button>
<buttonmyHighlightclass="btn">按钮三</button>
</div>

效果是这样:

如何在Angular中快速定位DOM元素

上述代码中的 nativeElement 其实包含的是 组件 中所有的DOM元素,如下图所示:

如何在Angular中快速定位DOM元素

通过调用 querySelector API就能获取页面元素,需要注意的是 querySelector 只返回第一个元素,当你需要选择多个元素的时候可以使用 querySelectorAll

通过@viewChild

<h1>
  {{title}}
</h1>
<div>
<buttonmyHighlightclass="btn btn1">按钮一</button>
<buttonmyHighlightclass="btn"#btn>按钮二</button> <!--增加一个变量-->
<buttonmyHighlightclass="btn">按钮三</button>
</div>
import {Component, ElementRef, OnInit, ViewChild} from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit{
  @ViewChild('btn') btn:ElementRef;//通过@ViewChild获取元素

  color:string;
  title = 'button !';

  constructor(privateel:ElementRef){}

  setHeight(){
    this.el.nativeElement.querySelector('.btn1').style.height = '300px';
  }

  setWidth(){
    this.btn.nativeElement.style.width = '200px';//定义宽度
  }

  ngOnInit(){
    this.setHeight();
    this.setWidth();
  }

}

效果如下:

如何在Angular中快速定位DOM元素

如果多个HTML元素都定义了相同的变量,使用 @viewChild 时只能选择到第一个元素。

更好的方法是配合 renderer2 对象提供的API去实现同样的效果,这样减少应用层与渲染层之间强耦合关系:

import {Component, ElementRef, OnInit, Renderer2, ViewChild} from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit{
  @ViewChild('btn') btn:ElementRef;

  color:string;
  title = 'button !';

   //初始化renderer2
  constructor(privateel:ElementRef,privaterenderer2: Renderer2){}

  setHeight(){
    this.el.nativeElement.querySelector('.btn1').style.height = '300px';
  }

  setWidth(){
    // this.btn.nativeElement.style.width = '200px';
    
    //使用renderer2的setStyle方法设置宽度
    this.renderer2.setStyle(this.btn.nativeElement,'width','200px')
  }

  ngOnInit(){
    this.setHeight();
    this.setWidth();
  }

}

参考文章中都提到了 @viewChild 配合 renderer 选择元素,但是在Angular4中 renderer 已经废弃掉了,变成了 renderer2

renderer2 API中还有其他的一些方法可以用来进行一些DOM操作:

class Renderer2 {
  data : {[key: string]: any}
  destroy() : void
  createElement(name: string, namespace?: string) : any
  createComment(value: string) : any
  createText(value: string) : any
  destroyNode : (node: any) => void |
  appendChild(parent: any, newChild: any) : void
  insertBefore(parent: any, newChild: any, refChild: any) : void
  removeChild(parent: any, oldChild: any) : void
  selectRootElement(selectorOrNode: string|any) : any
  parentNode(node: any) : any
  nextSibling(node: any) : any
  setAttribute(el: any, name: string, value: string, namespace?: string) : void
  removeAttribute(el: any, name: string, namespace?: string) : void
  addClass(el: any, name: string) : void
  removeClass(el: any, name: string) : void
  setStyle(el: any, style: string, value: any, flags?: RendererStyleFlags2) : void
  removeStyle(el: any, style: string, flags?: RendererStyleFlags2) : void
  setProperty(el: any, name: string, value: any) : void
  setValue(node: any, value: string) : void
  listen(target: 'window'|'document'|'body'|any, eventName: string, callback: (event: any) => boolean | void) : () => void
}

参考文章

  1. [译]Angular2新人常犯的5个错误
  2. Angular 2 ElementRef
  3. Angular Renderer2

以上所述就是小编给大家介绍的《如何在Angular中快速定位DOM元素》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Clean Architecture

Clean Architecture

Robert C. Martin / Prentice Hall / 2017-9-20 / USD 34.99

Practical Software Architecture Solutions from the Legendary Robert C. Martin (“Uncle Bob”) By applying universal rules of software architecture, you can dramatically improve developer producti......一起来看看 《Clean Architecture》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试