Я создаю веб-сайт электронной коммерции 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 можно было обновлять автоматически?
К сожалению для вас, вы не сможете сделать это с помощью простого контроллера. Вам понадобится @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.
Ваше здоровье