代码之家  ›  专栏  ›  技术社区  ›  Michael Borgwardt

grails:checkbox未设置回false

  •  9
  • Michael Borgwardt  · 技术社区  · 15 年前

    我正在开发一个grails(1.0.4)应用程序,我想在其中编辑网格视图中单个页面上的集合集合。我得到的工作非常好,只取决于索引的参数处理的春天MVC,除了一件事:

    网格中的布尔值(或布尔值)可以通过复选框设置,但不能取消设置,即当我选中复选框并进行更新时,该值将设置为true,但在我再次编辑时,取消选中复选框并进行更新,该值将保持为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 bug 它确切地描述了这个效果,但是它被标记为固定在1.0.2中,并且在那里描述的问题机制(隐藏字段名称的下划线放错了地方)在我的案例中不存在。

    你知道原因是什么吗?

    5 回复  |  直到 15 年前
        1
  •  4
  •   Michael Borgwardt    15 年前

    这是一个名叫julius huang的人在grails用户邮件列表中提出的解决方案。它是可重用的,但依赖于javascript为一个未选中的复选框填充一个带有“false”响应的隐藏字段,不幸的是html没有发送这个复选框。

    我黑客GSP发送“假”时 取消选中框(true->false) 自定义标记库。

    默认情况下,复选框在 取消选中,因此我将复选框用作 事件处理程序但发送隐藏字段 相反。

    控制器中的“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
  •  2
  •   Michael Borgwardt    15 年前

    这是我自己的解决方案,基本上是一个手动执行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本身,但不可重用(可能需要一些额外的工作)。

        3
  •  1
  •   alexpopescu    15 年前

    我认为最简单的解决办法是附加调试器,看看为什么GRAIUS不能填充这个值。考虑到grails是开源的,您将能够访问源代码,一旦您找到了解决方案,就可以修补您的版本。

    我还发现了另一个虫子 GRAILS-2861 其中提到了绑定到布尔的相关问题(参见marc在文章中的评论)。我想这正是你所描述的问题。

        4
  •  1
  •   Ben Williams    15 年前

    我会创建一个小样本应用程序来演示这个问题并把它附加到GrasBug(或者创建一个新的bug)。这里有人可以调试你的样例应用程序,或者你会发现bug并没有真正修复。

        5
  •  0
  •   Kuukage    15 年前

    试试这个,将日志设置为debug,首先尝试前3个如果它们没有显示问题,则将它们全部翻转以进行调试:

    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
    

    这将使您能够准确地看到参数设置何时以及如何失败,并可能找到解决方法。