Я создал это существо, которое нуждается в некоторой проверке:
Это файл home.html:
<!-- Modal -->
<div id = "vasoModal" class = "modal">
<div class = "modal-content">
<h4 class = "modal-title">Vasito</h4>
<h6>Seleccione hasta dos gustos</h6>
<form th:action = "@{/pedido}" name = "vasitoForm" method = "post">
<table class = "tabla">
<tr th:each = "gusto : ${gustos}">
<td class = "flavour" th:text = "${gusto.nombre}"></td>
<td><input class = "single-checkbox" type = "checkbox" th:field = "${gusto.id}"/></td>
</tr>
</table>
<button type = "submit" class = "btn-submit">Enviar Pedido</button>
</form>
</div>
</div>
Итак, теперь мне нужно проверить, какие из них были нажаты, и отправить это контроллеру для проверки:
var checkboxes = document.querySelectorAll('.single-checkbox');
var clicked = [];
checkboxes.forEach(elem => {
elem.addEventListener('click', (event) => {
event.stopPropagation();
alert(elem.value);
// My logic here was to add the clicked checkboxes to the clicked array and then send that to the controller to validate !!
Это нормально? }); });
Что ж ... У меня здесь две проблемы ... первая - это то, что эта строка в HTML не работает:
th:field = "${gusto.id}"
Я не могу привязать идентификатор каждого «gusto» (вкус на испанском) к флажкам (это казалось хорошим решением).
Я получаю следующую ошибку:
Neither BindingResult nor plain target object for bean name 'gusto' available as request attribute
Что ж ... Я искал это в Google и нашел решение, но не в моем случае, я отправляю ArrayList "gustos" в представление в контроллере.
@RequestMapping(value = "/")
public String getAllProductos(ModelMap modelMap){
List<Producto> productos = productoService.findAll();
List<Gusto> gustos = gustoService.findAll();
modelMap.put("gustos", gustos);
modelMap.put("productos", productos);
return "home";
}
Так что это немного странная проблема!
Ну ... вторая проблема или вопрос - это то, что я хочу сделать после ее решения ... она прокомментирована в файле JS:
// My logic here was to add the clicked checkboxes to the clicked array and then send that to the controller to validate !!
Такой подход в порядке ?? Может ли кто-нибудь помочь мне найти лучшее решение для ошибки флажков?
...



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Для вашего первого выпуска th:field= потребуется * вместо $. Попробуйте сменить th:field = "${gusto.id}" на th:field = "*{gusto.id}" - документация здесь.
Во-вторых, я не уверен, что это самый изящный способ сделать это, но у меня он работает. Сначала добавьте HttpServletRequest request (документация здесь) в качестве параметра запроса в методе POST. Из этого request вы можете извлечь Map<String, String[]>, из которого вы можете извлекать данные. Затем вы можете делать то, что хотите с участием, эти данные:
Map<String, String[]> dataFeed = request.getParameterMap(); // this pulls in the data from the checkboxes
for (Map.Entry<String, String[]> entry : dataFeed.entrySet()) { // this iterates through each entry from the data above
for (String str : request.getParameterValues(entry.getKey())) { // this loops through the key for each entry
Long yourVar = Long.parseLong(entry.getKey()); // assigning the long version of that str to yourVar
if (str.equals("Yes")) {
Do something with yourVar // do something with it
}
daoObject.save(whatever you've done above);
}
}
В вашем случае, возможно, сработает что-то вроде этого:
@RequestMapping(value = "saveGusto", method = RequestMethod.POST)
public String saveGusto(HttpServletRequest request) {
Map<String, String[]> dataFeed = request.getParameterMap();
for (Map.Entry<String, String[]> entry : dataFeed.entrySet()) {
for (String str : request.getParameterValues(entry.getKey())) {
Long gustoId = Long.parseLong(entry.getKey());
Gusto gusto = gustoDao.findOne(gId);
if (str.equals("some-value")) { // where some-value is value = "some-value" on your checkbox
// do something with the gusto
}
gustoDao.save(gusto);
}
}
}
Надеюсь, это даст вам еще одну возможность для исследования, если не что иное!