Thymeleaf에서 th:if와 th:insert를 조합하여 사용할 때의 주의

2306 단어 Thymeleaf

th:if → th:insert 순서로 동작시키고 싶다



여러 번 같은 실패를 해 버리므로 계명을 겸하여 기사에 남겨두기로 한다.

실패 사례



예를 들어, 가격이 존재하는 경우에만 특정 HTML을 삽입하려는 경우,

그만 다음과 같은 기술을 해 버린다.

productList.html
<!-- 価格が空でない場合、insertする --> 
<th:block th:if="${!#strings.isEmpty(price)}" th:insert="insert.html::product">
</th:block>

insert.html
<div th:fragment="product">
 <dt>価格</dt>
 <dd th:text="${price}"></dd>
</div>

그러나 이 경우는 th:insertth:if의 순서로 평가되어 버리기 때문에 의도한 동작이 되지 않는다.

price에 대해 isEmpty로 비어 있는지 확인하고 있지만 비어 있는지 여부 관계없이 th:insert가 실행됩니다.

속성의 판독 순서에 대해서는 공식적으로 기재한 바와 같이, 프래그먼트의 인클루드가 1번 최초로 실행된다.


해결 방법



무리하게 th:ifth:insert 를 1행으로 쓰지 않고, 나누어 기술하면 된다.

productList.html
<!-- 価格が空でない場合、insertする --> 
<th:block th:if="${!#strings.isEmpty(price)}">
  <th:block  th:insert="insert.html::product"></th:block>
</th:block>

이번은 th:insert 를 예로 들고 있지만 th:replace 이나 th:eachth:if 보다 우선적으로 평가되기 위해, 1행으로 조합해 이용하는 경우에 주의가 필요하다.

그 외에도, 의도한 동작이 되지 않는 경우는, 속성의 평가 순서에 대해서 Thymeleaf의 공식 페이지로부터 확인 가능하기 때문에,

평가 순서에 인식 차이가 없는지 확인하면 된다.

좋은 웹페이지 즐겨찾기