カスタムディレクティブを使用して、特定の条件に基づいてHost要素のクラスをどのように追加/削除しますか?
例:
@Directive({
selector: '[customDirective]'
})
export class CustomDirective {
constructor(service: SomService) {
// code to add class
if (service.someCondition()) {
// code to remove class
}
}
}
ngClass
ディレクティブを使用したくない場合(ヒント:関数を[ngClass]="myClasses()"
に渡すことができます(テンプレートのインラインが乱雑になる場合))、Renderer2
1つまたは複数のクラスを追加する場合:
export class CustomDirective {
constructor(private renderer: Renderer2,
private elementRef: ElementRef,
service: SomService) {
}
addClass(className: string, element: any) {
this.renderer.addClass(element, className);
// or use the Host element directly
// this.renderer.addClass(this.elementRef.nativeElement, className);
}
removeClass(className: string, element: any) {
this.renderer.removeClass(element, className);
}
}
Angularでディレクティブを使用している場合は、@HostBinding
を使用し、述語に基づいてクラスを追加/削除できるようにするためにclass.your-class
にバインドする必要があります。クラスを効果的に追加/削除するためにRenderer2
でDIを実行する必要はありません。
たとえば、BootstrapとReactive Formsを使用していて、有効または無効なフォームフィールドを示したい場合は、次のようにします。
import { Directive, Self, HostBinding, Input } from '@angular/core';
import { NgControl } from '@angular/forms';
@Directive({
selector: '[appCheckFormFieldValidity]'
})
export class CheckFormFieldValidity{
@Input() public class: string;
constructor(
@Self() private ngControl: NgControl
) { }
@HostBinding('class.is-valid')
public get isValid(): boolean {
return this.valid;
}
@HostBinding('class.is-invalid')
public get isInvalid(): boolean {
return this.invalid;
}
public get valid(): boolean {
return this.ngControl.valid &&
(this.ngControl.dirty || this.ngControl.touched);
}
public get invalid(): boolean {
return !this.ngControl.pending &&
!this.ngControl.valid &&
(this.ngControl.touched || this.ngControl.dirty);
}
}
これは厳密な例ではありませんが、@HostBinding
の使用法を示しています。この例を StackBlitz で作成しました
export class CustomDirective {
classname:string = "Magenta";
constructor(private renderer: Renderer2,
private elementRef: ElementRef,
service: SomService) {
}
addClass(className: string, element: any) {
// make sure you declare classname in your main style.css
this.renderer.addClass(this.elementRef.nativeElement, className);
}
removeClass(className: string, element: any) {
this.renderer.removeClass(this.elementRef.nativeElement,className);
}
}