Search code examples
angularangular2-directivesangular-directive

How to add/remove class from directive


Using a custom directive how would you add/remove a class on the host element based on a specific conditions?

Example:

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

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

Solution

  • If you don't want to use the ngClass directive (Hint: you can pass a function to [ngClass]="myClasses()" if it would be to messy inline in your template) you can just utilize the Renderer2 for it to add one or more classes:

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