Grails: флажок не устанавливается в false - PullRequest
9 голосов
/ 22 февраля 2009

Я занимаюсь разработкой приложения Grails (1.0.4), в котором я хочу редактировать коллекцию коллекций на одной странице в виде сетки. Я понял, что он работает достаточно хорошо, в зависимости только от обработки индексированных параметров Spring MVC, за исключением одного:

логические (или, в этом отношении, логические) значения в сетке могут быть установлены с помощью флажка, но не сброшены, т. Е. Когда я проверяю флажок и обновляю, значение устанавливается в true, но впоследствии, когда я снова редактирую, снимите флажок и обновите, оно остается верным.

Это код GSP флажка:

<g:checkBox name="tage[${indexTag}].zuweisungen[${indexMitarb}].fixiert" value="${z.fixiert}" />

И это HTML, который генерируется:

<input type="hidden" name="tage[0].zuweisungen[0]._fixiert" />
<input type="checkbox" name="tage[0].zuweisungen[0].fixiert" checked="checked" id="tage[0].zuweisungen[0].fixiert"  />

Я нашел ошибку Grails , которая описывает именно этот эффект, но он помечен как исправленный в 1.0.2, и описанный там механизм проблемы (подчеркивание в имени скрытого поля помещено не в том месте ) нет в моем случае.

Есть идеи, в чем может быть причина?

Ответы [ 5 ]

4 голосов
/ 01 марта 2009

Это решение, предложенное парнем по имени Джулиус Хуанг из списка рассылки grails-user. Его можно использовать повторно, но он использует JavaScript для заполнения скрытого поля «ложным» ответом для не отмеченного флажка, который, к сожалению, HTML не отправляет.

Я взламываю GSP, чтобы отправить "ложь", когда снимите флажок (true -> false) с помощью Пользовательский TagLib.

По умолчанию checkBox ничего не отправляет, когда снимите флажок, поэтому я использую флажок как обработчик события, но отправить скрытое поле вместо этого.

«params» в контроллере можно обрабатывать "ложь" -> "правда" без каких-либо модификация. например. Все осталось то же самое в контроллере.

Использование пользовательского тега в GSP (пример usedfunc_F равен "true"),

<jh:checkBox name="surveyList[${i}].usedfunc_F" value="${survey.usedfunc_F}"></jh:checkBox>

Вот что генерирует тег,

<input type="hidden" name="surveyList[#{i}].usedfunc_F" id="surveyList[#{i}].usedfunc_F" value="false" />
<input type="checkbox" onclick="jhtoggle('surveyList[#{i}].usedfunc_F')" checked="checked" />

Javascript

<script type="text/javascript">
function jhtoggle(obj) {
   var jht = document.getElementById(obj);
   jht.value = (jht.value !='true' ? 'true' : 'false');
}
</script>
2 голосов
/ 01 марта 2009

Это мое собственное решение, в основном обходной путь, который вручную делает то, что должна делать привязка данных grails (но не делает):

Map<String,String> checkboxes = params.findAll{def i = it.key.endsWith("._fixiert")} // all checkboxes
checkboxes.each{
    String key = it.key.substring(0, it.key.indexOf("._fixiert"))
    int tagIdx = Integer.parseInt(key.substring(key.indexOf('[')+1, key.indexOf(']')))
    int zuwIdx = Integer.parseInt(key.substring(key.lastIndexOf('[')+1, key.lastIndexOf(']')))
    if(params.get(key+".fixiert"))
    {
        dienstplanInstance.tage[tagIdx].zuweisungen[zuwIdx].fixiert = true
    }
    else
    {
        dienstplanInstance.tage[tagIdx].zuweisungen[zuwIdx].fixiert = false                    
    }
}

Работает, не требует никаких изменений в самом Grails, но не может использоваться повторно (возможно, это можно сделать с помощью некоторой дополнительной работы).

1 голос
/ 26 февраля 2009

Я думаю, что самый простой обходной путь - подключить отладчик и посмотреть, почему Grails не может заполнить значение. Принимая во внимание, что Grails является открытым исходным кодом, вы сможете получить доступ к исходному коду, и как только вы найдете решение для него, вы можете исправить свою версию.

Я также нашел эту другую ошибку GRAILS-2861 , в которой упоминается проблема, связанная с привязкой к логическим значениям (см. Комментарий Марка в теме). Я полагаю, что именно эту проблему вы описываете.

1 голос
/ 25 февраля 2009

Я хотел бы создать небольшое приложение-пример, которое демонстрирует проблему, и прикрепить его к ошибке Grails (или создать новое). Кто-то здесь может отладить ваше примерное приложение, или вы показали, что ошибка на самом деле не исправлена.

0 голосов
/ 28 февраля 2009

Попробуйте, установите журналы на DEBUG, сначала попробуйте первые 3, если они не показывают проблему, переверните их все на DEBUG:

codehaus.groovy.grails.web.servlet="error"  //  controllers
codehaus.groovy.grails.web.pages="error" //  GSP
codehaus.groovy.grails.web.sitemesh="error" //  layouts
codehaus.groovy.grails."web.mapping.filter"="error" // URL mapping
codehaus.groovy.grails."web.mapping"="error" // URL mapping
codehaus.groovy.grails.commons="info" // core / classloading
codehaus.groovy.grails.plugins="error" // plugins
codehaus.groovy.grails.orm.hibernate="error" // hibernate integration

Это должно позволить вам точно видеть, когда и как происходит сбой настройки параметров, и, вероятно, найти обходной путь.

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