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

Я создаю веб-сайт электронной коммерции 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 в chargeReqeust можно было обновлять автоматически?

0
0
809
1

Ответы 1

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

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

@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, который позволяет вам

identify a user across more than one-page request or visit a Web site and to store information about that user.

Ваше здоровье

Другие вопросы по теме