Как передать содержимое innerHTML в th: поле в thymeleaf?

#spring #spring-boot #spring-mvc #thymeleaf

#spring #spring-загрузка #spring-mvc #thymeleaf

Вопрос:

Я создаю веб-сайт электронной коммерции Spring Boot, и у меня есть span тег, содержащий общую цену на данный момент в корзине, и обновление с помощью JavaScript за кулисами:

 <form method="POST" th:object="${chargeRequest}">
    <span class="total">
        Total: <span class="total-price">$0</span>
    </span>
</form>
  

и я передаю атрибут модели model.addAttribute("chargeRequest", new ChargeRequest()); на эту страницу, и класс ChargeRequest определяется как:

 public class ChargeRequest {
    private int amount;

    // constructor, setter/getter
    // ...
}
  

Вопрос в том, как можно обновить amount в chargeRequest и передать его обратно контроллеру, используя Thymeleaf?

th:field допустимо только для <input> , <select> , <textarea> , я не могу напрямую поместить его в <span> тег

Я пытался передать 2 атрибута:

 model.addAttribute("amount", new String("$0"));
model.addAttribute("chargeRequest", new ChargeRequest());
  
 <span class="total">
    Total: <span class="total-price" th:text="${amount}">$0</span>
    <input type="hidden" th:value="${amount}, id="amount", name="amount">
</span>
  

Но я не знаю, как обновить, ${amount} чтобы amount in chargeReqeust можно было обновлять автоматически?

Ответ №1:

К сожалению для вас, вы не сможете сделать это с помощью простого контроллера. Вам понадобится @ControllerAdvice, который будет служить глобальным контроллером, чтобы иметь возможность обновлять корзину всякий раз, когда кто-то добавляет товар в свою корзину или удаляет товары из своей корзины.

Другими словами, вам нужен ГЛОБАЛЬНЫЙ КОНТРОЛЛЕР. Этот глобальный контроллер должен проверять атрибут SESSION, чтобы вы могли изменять общую сумму корзины и обновлять ее каждый раз, когда происходит изменение. Например, проверьте это ниже.

 @ControllerAdvice
public class GlobalCartController{
    @Autowired
    private HttpSession session;
    @ModelAttribute("cartModel")
    public CartModel getCartTotal(){
        if(session.getAttribute("cart")==null){
           //Here you create cart attribute for the session 
           // then
           session.setAttribute("cartModel", cartObjectWithUpdatedTotal);
     }
     return (CartObjectWithUpdatedTotal) session.getAttribute("cartModel");
  

}

Обратите внимание, что глобальный контроллер всегда будет проверяться на всех маршрутах и не требует маршрутизации, это позволяет вам использовать класс HttpSession autowired, который позволяет вам

идентифицировать пользователя в более чем одностраничном запросе или посетить веб-сайт и сохранить информацию об этом пользователе.

Приветствия