在 Angular 中使用 Renderer2

简介: 在 Angular 中使用 Renderer2

Renderer2 类

Renderer2 类是 Angular 提供的一个抽象服务,允许在不直接操作 DOM 的情况下操纵应用程序的元素。这是推荐的方法,因为它使得更容易开发可以在没有 DOM 访问权限的环境中渲染的应用程序,比如在服务器上、在 Web Worker 中或在原生移动端。

基本用法

通常会在自定义指令中经常使用 Renderer2,因为 Angular 指令是修改元素的逻辑构建块。以下是一个简单的示例,使用 Renderer2 的 addClass 方法向具有该指令的元素添加 wild 类:

import { Directive, Renderer2, ElementRef, OnInit } from '@angular/core';
@Directive({
  selector: '[appGoWild]'
})
export class GoWildDirective implements OnInit {
  constructor(private renderer: Renderer2, private el: ElementRef) {}
  ngOnInit() {
    this.renderer.addClass(this.el.nativeElement, 'wild');
  }
}

现在,您可以在模板中向元素添加该指令,渲染时将添加 wild 类:

<h1 appGoWild>
  Hello World!
</h1>
<!-- <h1 class="wild">Hello World!</h1> -->

您可以看到,总体上使用 Renderer2 并不比直接操作 DOM 更复杂。现在让我们来看一些最有用的方法:

createElement / appendChild / createText

创建新的 DOM 元素并将它们附加到其他元素中。在这个例子中,我们创建一个新的 div 和一个文本节点。然后我们将文本节点放入我们的新 div 中,最后将我们的 div 添加到我们指令引用的元素中:

constructor(private renderer: Renderer2, private el: ElementRef) {}
ngOnInit() {
  const div = this.renderer.createElement('div');
  const text = this.renderer.createText('Hello world!');
  this.renderer.appendChild(div, text);
  this.renderer.appendChild(this.el.nativeElement, div);
}

我们的模板在渲染后将如下所示,假设我们在一个 article 元素上应用了该指令:

<article>
  <div>Hello world!</div>
</article>

setAttribute / removeAttribute

使用 setAttribute 或 removeAttribute 来设置或移除属性:

constructor(private renderer: Renderer2, private el: ElementRef) {}
ngOnInit() {
  this.renderer.setAttribute(this.el.nativeElement, 'aria-hidden', 'true');
}

addClass / removeClass

要添加类,可以执行以下操作:

constructor(private renderer: Renderer2, private el: ElementRef) {}
ngOnInit() {
  this.renderer.addClass(this.el.nativeElement, 'wild');
}

我们在上面的示例中已经介绍了 addClass。至于 removeClass,只需提供元素引用和要移除的类名:

constructor(private renderer: Renderer2, private el: ElementRef) {}
ngOnInit() {
  this.renderer.removeClass(this.el.nativeElement, 'wild');
}

setStyle / removeStyle

使用 setStyle 使用 Renderer2 添加内联样式:

constructor(private renderer: Renderer2, private el: ElementRef) {}
ngOnInit() {
  this.renderer.setStyle(
    this.el.nativeElement,
    'border-left',
    '2px dashed olive'
  );
}

…并使用 removeStyle 来移除它:

constructor(private renderer: Renderer2, private el: ElementRef) {}
ngOnInit() {
  this.renderer.removeStyle(this.el.nativeElement, 'border-left');
}

setProperty

通过以下示例,您可以在图像元素上设置 alt 属性:

constructor(private renderer: Renderer2, private el: ElementRef) {}
ngOnInit() {
  this.renderer.setProperty(this.el.nativeElement, 'alt', 'Cute alligator');
}

…或设置输入字段的值:

// ...
ngOnInit() {
  this.renderer.setProperty(this.el.nativeElement, 'value', 'Cute alligator');
}

😄 这就结束了我们的概述。请参考 API 文档以获取可用方法的完整列表。


目录
相关文章
|
Web App开发 移动开发 安全
Android DEPPLINK、APPLink原理简析
Android DEPPLINK、APPLink原理简析
2782 0
Android DEPPLINK、APPLink原理简析
|
4月前
|
前端开发
html详细的网格样式
CSS网格布局(Grid Layout)是CSS中强大的二维布局系统,能够灵活控制行与列,适用于构建复杂网页结构。它支持响应式设计、对齐控制、区域命名等功能,代码更简洁直观,极大提升了布局效率与可维护性。
132 0
|
消息中间件 Apache 云计算
阿里云消息团队创新论文被软件工程顶会 FM 2024 录用
此论文灵感来源于 RocketMQ 适配阿里云倚天 CPU 的性能优化过程中。RocketMQ 此前在发送消息的过程中存在两种锁:自旋锁和互斥锁。本文旨在提出一种新的自适应 K 值退避锁,能够让高并发系统的部署者无需考虑两种锁的优劣势,只需使用一把锁即可实现性能的最优以及最低的资源损耗。
275 68
|
前端开发 JavaScript 安全
如何在 React Native 中实现热更新?
如何在 React Native 中实现热更新?
1214 64
|
Ubuntu
ubuntu引导修复
ubuntu引导修复
266 0
|
JavaScript 前端开发
JavaScript 的数组方法 map()、filter() 和 reduce() 提供了函数式编程处理元素的方式
【5月更文挑战第11天】JavaScript 的数组方法 map()、filter() 和 reduce() 提供了函数式编程处理元素的方式。map() 用于创建新数组,其中元素是原数组元素经过指定函数转换后的结果;filter() 则筛选出通过特定条件的元素生成新数组;reduce() 将数组元素累计为单一值。这三个方法使代码更简洁易读,例如:map() 可用于数组元素乘以 2,filter() 用于选取偶数,reduce() 计算数组元素之和。
184 2
|
JavaScript 开发者
【TypeScript 技术专栏】TypeScript 与 ESLint 代码规范
【4月更文挑战第30天】TypeScript和ESLint是代码规范的关键工具。TypeScript通过静态类型检查、接口与模块系统提升代码质量;ESLint则负责语法检查、风格统一和最佳实践。两者结合使用,提供全面的代码规范保障。制定团队共识、保持灵活性并持续优化规范是关键。常见问题包括类型不匹配、风格不一致和未使用变量,可通过这两工具解决。实际案例分析进一步说明了它们在项目中的应用。重视代码规范,利用这些工具,能提高代码质量和开发效率。
377 0
|
存储 开发框架 Java
SpringBoot开发符合S3协议的文件存储服务
公司最近的业务大量涉及安可项目,要求避免使用第三方组件,原有开发框架支持本地文件存储/Minio/各类云存储,现在要求文件独立存储且文件服务需要自研,经调研评估后决定基于SpringBoot开发文件存储服务,使用s3协议标准,这样可以直接使用aws-sdk接入无需再开发客户端,且安全安全性方面可以得到足够的保证
558 0
SpringBoot开发符合S3协议的文件存储服务
|
Linux
LINUX编译mate-desktop/pluma-1.24.0文本编辑器
LINUX编译mate-desktop/pluma-1.24.0文本编辑器
221 0

热门文章

最新文章