angular - 在 Angular 中调用 document.documentElement.classList.add 有什么问题吗?
问题描述
我正在阅读很多内容,人们根本不应该在 Angular 中操作 DOM,有人可以向我解释为什么简单地调用:
document.documentElement.classList.add('some-class')
不好?
……还是我想多了?这是可以接受的吗?
如果错了,正确的方法是什么?
编辑:
确切地说,向上述添加类的正确方法是什么document.documentElement
。
document.documentElement
= 根元素 = <html>
元素。
解决方案
解释
正如评论中提到的那样,Angular 不会承认这样的操作,所有操作都应该通过 Angular 完成。这保留了 DOM 的构建方式。这是一个完整的主题,我不是 100% 的。另一种方法是使用Angular 提供的renderer2旁边的ViewChild。
要记住的一件事是,有时在没有 DOM 可直接交互的情况下,需要在服务器或 Web Worker 中渲染应用程序。Renderer2 消除了直接 DOM 交互可能出现的任何问题。
解决方案
将 a#
应用于要与 ViewChild 一起使用的元素。
<div #testDiv>
some interesting content
</div>
在你的控制器中。
import { Component, ViewChild, ElementRef, Renderer2 } from '@angular/core';
export class exampleComponent {
constructor(private renderer: Renderer2) {}
public @ViewChild('testDiv') testDiv: ElementRef;
public addClass(): void
{
this.renderer.setAttribute(this.testDiv.nativeElement, 'class', 'example-class');
}
}
还可以用。
this.renderer.addClass(this.testDiv.nativeElement, 'example-class')
这是使用renderer2的一些示例。
可能只使用 ViewChild 就可以侥幸成功,但想加入渲染器以显示如何与 DOM 交互。
this.testDiv.nativeElement.className = 'example-class';
推荐阅读
- biztalk - BizTalk 映射中的累积和 functoid 忽略小数点后的零
- python - 在 python 控制台中显示汉字
- c++ - 这是一个错误吗?constexpr 构造函数静默变为非 constexpr
- c# - 在c#中锁定sqlcommand对象
- bootstrap-4 - 无法获得下拉菜单的“打开”状态
- xml - 标签的Apache骆驼更改值
- java - 为什么当 Arcore 片段工作时 DrawerLayout 不起作用?
- r - R - 如何格式化持续时间以使用 dplyr 进行正确排序
- android - room db 使用@query 更新多行
- powershell - PowerShell 没有拆分参数