I created the following simple example component that adds some attributes and listener to the component DOM element using the host property of the @Component decorator. In my c
ngClass
is a directive and can't be used in host bindings. Host bindings only supports
'[propName]':'expr'
'[attr.attrName]':'expr'
(event)="someFunction(event);otherExpr"
, [style.width]="booleanExpr"
[class.className]="booleanExpr"
binding.[class]="expr"
where expr
is a string with space separated classesThis works for me and it's pretty modular:
import { Component, HostBinding, Input } from '@angular/core'
type Directions = 'vertical' | 'horizontal'
/**
* A hairline.
*/
@Component({
selector: 'hairline',
styleUrls: ['./hairline.component.scss'],
template: '',
})
export class HairlineComponent {
@Input() direction: Directions = 'horizontal'
@Input() padding = false
@HostBinding('class')
get classes(): Record<string, boolean> {
return {
[this.direction]: true,
padding: this.padding,
}
}
}
Here are two different ways to bind a host element class to a property using the @HostBinding
decorator:
@HostBinding('class.enabled') private get isEnabled() { // use getter to reflect external value
return this.selectionService.state.isEnabled;
}
@HostBinding('class.selected') private isSelected = false; // setting this add/removes 'selected' class
constructor(private selectionService: SelectionService) {
this.selectionService.select$.subscribe(isSelected => {
this.isSelected = isSelected;
});
}