私は現在Angular 2.を学習しています。Angular Renderer
を設定してElementStyle
を設定する方法を理解しましたが、 Renderer
メソッドを使用したい:
setElementClass(renderElement: any, className: string, isAdd: boolean) : void
私の質問は、CSSクラスを属性ディレクティブにインポートするにはどうすればよいですか? CSSクラスをJSONに変換する必要がありますか?
元のOPは、Rendererの使用方法を尋ねていました。完全を期すために@HostBindingを含めました。
クラスを要素に追加するには、 @ HostBinding を使用できます
import { Directive, HostBinding} from '@angular/core';
@Directive({
selector: '[myDirective]',
})
export class MyDirective {
@HostBinding('class')
elementClass = 'custom-theme';
constructor() {
}
}
複数のクラスを使いやすくするために、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');
}
}
より低レベルのAPIは Render2 です。 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');
}
}
RendererまたはRenderer2クラスを使用する理由は何ですか?ディレクティブでこれを行う好ましい方法は、 @ HostBinding デコレーターを使用することです。
例:
import { HostBinding } from '@angular/core';
@Directive({
selector: '[myDirective]'
})
export class MyDirective {
@HostBinding('class')
className = 'my-directive-css-class';
}
RendererとElementRefを使用してcssクラスを要素に追加する方法の例。
@Directive({
selector: '[whatever]'
})
class WhateverDirective {
constructor(renderer: Renderer, el: ElementRef) {
renderer.setElementClass(el.nativeElement, 'whatever-css-class', true);
}
}
Whatever-css-classは、htmlで参照されるcssファイルで定義されます