Ответ 1
Оригинальный OP спрашивал, как использовать Renderer. Я включил @HostBinding для полноты.
Использование @HostBinding
Чтобы добавить класс к элементу, вы можете использовать @HostBinding
import { Directive, HostBinding} from '@angular/core';
@Directive({
selector: '[myDirective]',
})
export class MyDirective {
@HostBinding('class')
elementClass = 'custom-theme';
constructor() {
}
}
Использование @HostBinding с несколькими классами
Чтобы сделать несколько классов более удобными в использовании, вы можете использовать геттер ES6 и объединить классы перед их возвратом:
import { Directive, HostBinding} from '@angular/core';
@Directive({
selector: '[myDirective]',
})
export class MyDirective {
protected _elementClass: string[] = [];
@Input('class')
@HostBinding('class')
get elementClass(): string {
return this._elementClass.join(' ');
}
set(val: string) {
this._elementClass = val.split(' ');
}
constructor() {
this._elementClass.push('custom-theme');
this._elementClass.push('another-class');
}
}
Использование Renderer
API более низкого уровня - Renderer2. Renderer2 полезен, когда у вас есть динамический набор классов, которые вы хотите применить к элементу.
Пример:
import { Directive, ElementRef, Renderer2 } from '@angular/core';
@Directive({
selector: '[myDirective]',
})
export class MyDirective {
constructor(private renderer: Renderer2, hostElement: ElementRef) {
renderer.addClass(hostElement.nativeElement, 'custom-theme');
}
}