2

I'm trying to append a css class depending on multiple if cases with the ternary operator.

Is my ternary wrong?

I get the below error:

Caused by: org.thymeleaf.exceptions.TemplateProcessingException: Could not parse as expression error.

If I look up the doc or other posts here I couldn't find a correct solution.

My code is the following:

<table>
    <tr th:each="product: ${products}">

    <th th:text="${product.status}"
        th:classappend="
           ${product.status == 0} ? class1 :
           ${product.status == 1} ? class2 :
           ${product.status == 2} ? class3 :
           ${product.status == 3} ? class4 : class5">
    </th>
<table>
Giorgi Tsiklauri
  • 9,715
  • 8
  • 45
  • 66

2 Answers2

1

Ternary Operator is an operator that operates on three operands.

An expression a ? b : c evaluates to b if the value of a is true, and otherwise to c.

In your code:

<table>
    <tr th:each="product: ${products}">

    <th th:text="${product.status}"
        th:classappend="
           ${product.status == 0} ? class1 :
           ${product.status == 1} ? class2 :
           ${product.status == 2} ? class3 :
           ${product.status == 3} ? class4 : class5">
    </th>
<table>

how many operands you have after your first :? or to be more precise, what is the expression you have after that colon?

If you have a composite expression, and your false candidate value is another ternary operator, you will have to let the engine parse your composite expression, including its nested operators, as:

a ? b : c

therefore, you have to group your chained nested operators as:

<table>
    <tr th:each="product: ${products}">
        <th th:text="${product.status}" th:classappend="
            ${product.status == 0} ? class1 :
            (${product.status == 1} ? class2 :
            (${product.status == 2} ? class3 :
            (${product.status == 3} ? class4 : class5)))">
        </th>
</table>
Giorgi Tsiklauri
  • 9,715
  • 8
  • 45
  • 66
0

I found a solution:

wrapping the other conditions in ()

like this:

<table>
    <tr th:each="product: ${products}">

    <th th:text="${product.status}"
        th:classappend="
           ${product.status == 0} ? class1 :
           (${product.status == 1} ? class2 :
           (${product.status == 2} ? class3 :
           (${product.status == 3} ? class4 : class5")))>
    </th>
<table>