'Dynamic classname inside ngClass in angular 2
I need to interpolate a value inside of an ngClass expression but I can't get it to work.
I tried these solution which are the only ones that makes sense to me, these two fails with the interpolation:
<button [ngClass]="{'{{namespace}}-mybutton': type === 'mybutton'}"></button>
<button [ngClass]="{namespace + '-mybutton': type === 'mybutton'}"></button>
This one works with the interpolation but fails with the dynamically added class because the entire string gets added as a class:
<button ngClass="{'{{namespace}}-mybutton': type === 'mybutton'}"></button>
So my question is how do you use dynamic classnames in ngClass like this?
Solution 1:[1]
This one should work
<button [ngClass]="{[namespace + '-mybutton']: type === 'mybutton'}"></button>
but Angular throws on this syntax. I'd consider this a bug. See also https://stackoverflow.com/a/36024066/217408
The others are invalid. You can't use [] together with {{}}. Either one or the other. {{}} binds the result stringified which doesn't lead to the desired result in this case because an object needs to be passed to ngClass.
As workaround the syntax shown by @A_Sing or
<button [ngClass]="type === 'mybutton' ? namespace + '-mybutton' : ''"></button>
can be used.
Solution 2:[2]
<div *ngFor="let celeb of singers">
<p [ngClass]="{
'text-success':celeb.country === 'USA',
'text-secondary':celeb.country === 'Canada',
'text-danger':celeb.country === 'Puorto Rico',
'text-info':celeb.country === 'India'
}">{{ celeb.artist }} ({{ celeb.country }})
</p>
</div>
Solution 3:[3]
Is basically duplication of the other answers - but I didn't get it completely. maybe someone will finally understand it with this example now.
[ngClass]="['svg-icon', 'recolor-' + recolor, size ? 'size-' + size : '']"
will result for e.g. in
class="svg-icon recolor-red size-m"
Solution 4:[4]
i want to mention some important point to bare in mind while implementing class binding.
[ngClass] = "{
'badge-secondary': somevariable === value1,
'badge-danger': somevariable === value1,
'badge-warning': somevariable === value1,
'badge-warning': somevariable === value1,
'badge-success': somevariable === value1 }"
class here is not binding correctly because one condition is to be met, whereas you have two identical classes 'badge-warning' that may have two different condition. To correct this
[ngClass] = "{
'badge-secondary': somevariable === value1,
'badge-danger': somevariable === value1,
'badge-warning': somevariable === value1 || somevariable === value1,
'badge-success': somevariable === value1 }"
Solution 5:[5]
This works perfectly!
<div [class.any-class]="condition"></div>
Example:
<div [class.hide]="user.isPaid()"></div>
Solution 6:[6]
The easiest way might be to define a getter in your component.ts. Most importantly, it's one of the recommendations in Angular coding style
// in your component.ts
get buttonClasses() {
return { [`${this.namespace}-mybutton`]: this.type === 'mybutton' }
}
<!-- in your component.html -->
<button [ngClass]="buttonClasses"></button>
Solution 7:[7]
Here's an example of something I'm doing for multiple classes with multiple conditions:
[ngClass]="[variableInComponent || !anotherVariableInComponent ? classes.icon.large : classes.icon.small, editing ? classes.icon.editing : '']"
where:classes is an object containing strings of various classnames.
e.g. class.icon.large = "app__icon--large"
It's dynamic! Updates as the conditions update.
Solution 8:[8]
You can use <i [className]="'fa fa-' + data?.icon"> </i>
Solution 9:[9]
more elegant solution is to use && (using NgFor and its first, its free to use ur own matching tho):
<div
*ngFor="let day of days;
let first = first;"
class="day"
[ngClass]="first && ('day--' + day)"
</div>
will turn out as:
class="day day--monday"
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Community |
| Solution 2 | SHUBHASIS MAHATA |
| Solution 3 | perform3r |
| Solution 4 | |
| Solution 5 | Dharman |
| Solution 6 | |
| Solution 7 | ykadaru |
| Solution 8 | Anthony Agbator |
| Solution 9 |
