Grails 3.3.9: Действие контроллера вызова при установленном флажке
Я довольно плохо знаком с Grails и фреймворками в целом, так что это, скорее всего, очень простая проблема. Единственными многообещающими решениями, которые мне удалось найти, была работа с тегом, который, по-видимому, устарел в Grails 3. Подобные вопросы существуют, но все время, когда они еще были.
Я пытаюсь запрограммировать способ отображения продуктов, сгруппированных по подкатегориям, которые затем сгруппированы по категориям. Когда моя страница загружается, подкатегории и категории запрашиваются из моей базы данных, и в представлении отображаются параметры выбора (тег выбора и флажки).
Когда один из флажков, представляющих подкатегории, отмечен, мне нужно выполнить запрос к базе данных, чтобы получить информацию о продукте и обновить HTML-элемент, отображая шаблон для каждой возвращаемой строки. У меня есть действие контроллера, который делает все это. Моя единственная проблема заключается в том, что мне нужен способ вызывать действие контроллера всякий раз, когда установлен один из флажков.
Возможно, я мог бы обойти это, используя actionSubmit и скрытую кнопку отправки, которая нажимается javascript всякий раз, когда флажок установлен, но это не похоже на правильное решение.
Возможно, мне здесь не хватает какой-то очень простой функциональности, но я уже провел тщательный поиск и не нашел подходящего решения, вероятно, потому, что не использовал правильные условия поиска. Я был бы так счастлив, если бы кто-нибудь мог мне помочь с этим. Большое спасибо уже!
1 ответ
В следующем примере используется функция javascript, активированная в ответ на отмеченный / снятый флажок, значение которого передается действию, из которого вы можете делать все что угодно со значением флажка, выполнять запрос и т. Д. В настоящее время действие отображается шаблон для обновления представления с результатами базы данных.
index.gsp
<!DOCTYPE html>
<html>
<head>
<meta name="layout" content="main" />
<script type="text/javascript">
$(document).ready(function(){
$( '#cb' ).click( function() {
var checked = $(this).is(":checked");
$.ajax( {
url: "/yourController/yourAction?checked=" + checked,
type: "get",
success: function ( data ) {
$( '#resultDiv' ).html( data )
},
error: function(jqXHR, textStatus, errorThrown) {
console.log( 'Error rendering template ' + errorThrown )
}
} );
})
});
</script>
</head>
<body>
<div id="resultDiv"></div>
<g:form>
<g:checkBox name="cb" />
</g:form>
</body>
YourController
class YourController {
def yourAction() {
// you may want to do something with the value of params.checked here?
def dbResults = YourDomain.getStuff()
render ( template: 'theTemp', model: [dbResults: dbResults] )
}
}
_theTemp.gsp
<table>
<caption>Table of stuff</caption>
<g:each in="${dbResults}" var="aThing">
<tr>
<td>${aThing}</td>
</tr>
</g:each>
</table>