Использование Renderer2 в Angular
Класс Renderer2 — это абстракция, предоставляемая Angular в виде службы, которая позволяет манипулировать элементами вашего приложения, не касаясь DOM напрямую. Это рекомендуемый подход, потому что он упрощает разработку приложений, которые можно отображать в средах, не имеющих доступа к DOM, например на сервере, в веб-воркере или на собственном мобильном устройстве.
Обратите внимание, что исходная служба Renderer теперь устарела в пользу Renderer2.
Основное использование
Вы часто будете использовать 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');
}
}
Обратите внимание, как мы также используем ElementRef, чтобы получить доступ к подчёркнутому нативному элементу, к которому присоединена наша директива.
И теперь вы можете добавить директиву к элементам в шаблоне, и дикий класс будет добавлен при рендеринге:
<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>
<div>Hello world!</div>
</article>
установить атрибут/удалить атрибут
Используйте setAttribute или removeAttribute, чтобы установить или удалить атрибут:
constructor(private renderer: Renderer2, private el: ElementRef) {}
ngOnInit() {
this.renderer.setAttribute(this.el.nativeElement, 'aria-hidden', 'true');
}
добавить класс/удалить класс
Для addClass вы можете сделать следующее:
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, чтобы добавить встроенные стили с помощью 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.