I want to dynamically add a css class to an element I am looping over.
The loop is like this:
You almost got it :)
It should be without interpolation markup ({{
and }}
):
<li ng-repeat="todo in todos" ng-class="todo.priority">
...
You can simply assign a function as an expression and return proper class from there. Edit: there is also better solution for dynamic classes. Please see note below.
Snippet from view:
<div ng-class="appliedClass(myObj)">...</div>
and in the controller:
$scope.appliedClass = function(myObj) {
if (myObj.someValue === "highPriority") {
return "special-css-class";
} else {
return "default-class"; // Or even "", which won't add any additional classes to the element
}
}
I've recently learned about another approach. You pass in an object which has properties corresponding to the classes you operate on, and the values are expressions or boolean variables. A simple example:
ng-class="{ active: user.id == activeId }"
In this case active
class will be added to the element as long as user.id
matches activeId
from the $scope
object!
If you just want to add a class, use the class
attribute with interpolation:
class="priority-is-{{todo.priority}}"
You can do this dynamically and with a ternary.
ng-class="service.Icon != '' ? service.Icon : 'fas fa-arrow-alt-circle-right'"
The above code will inject the class stored in Icon if it is not null and default to the second if you its not included.
This will allow for multiple classes.
The answer above where you call a function() in databound instances may cause a document consumption loop if anything in the state changes. If you were to put a console write in that, you may find your page is rendered 100 times before it stops looping.
NOTE: Don't put the object {} around it when using ternary. You will get errors.