web-dev-qa-db-ja.com

ディレクティブからクラスを追加/削除する方法

カスタムディレクティブを使用して、特定の条件に基づいてHost要素のクラスをどのように追加/削除しますか?

例:

@Directive({
  selector: '[customDirective]'
})
export class CustomDirective {
  constructor(service: SomService) {
    // code to add class

    if (service.someCondition()) {
        // code to remove class
    }
  }
}
9
Napas

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);
   }

}
23
lexith

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 で作成しました

0
mtpultz
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);
   }

}
0
Michael Ganesan