Как я могу правильно проверить флажки с Spring MVC и ThymeLeaf? - PullRequest
0 голосов
/ 23 ноября 2018

Я создал этого твари, которая нуждается в некоторой проверке:

enter image description here

Это файл 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}"

Я не могубыть в состоянии привязать id каждого "gusto" (аромата на испанском) к флажкам (это казалось хорошим решением).

Я получаю следующую ошибку:

Ни BindingResult, ни простой целевой объект для имени bean-компонента 'gusto' не доступны в качестве атрибута запроса

Хорошо ... Я нашел это в 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:

// Моя логика заключалась в том, чтобы добавить отмеченные флажки в массив, в который нажали, и затем отправить это контроллеру впроверить !!

Это подход окей ??Может кто-нибудь помочь мне найти лучшее решение для ошибки флажков ??

...

1 Ответ

0 голосов
/ 26 ноября 2018

Для вашего первого выпуска 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);
        }
    }
}

Надеюсь, что это даетВы еще один путь для исследования, если не что иное!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...