如何在Play!框架中将复选框绑定到布尔值?

12

我正在使用Play!框架开发的应用程序中有一个名为gift的对象,其中包含一个布尔属性,称为Taken。如何在我的视图上将此值的状态显示为复选框?我已经尝试过:-

<input id="gift_Taken" class="" type="checkbox" name="gift.Taken" value="true"  />
<input type="hidden" name="gift.Taken" value="false" />

根据我从自动生成的CRUD表单中看到的例子,但是当属性为True时,复选框未被选中,这正是我想要的。

有人知道实现这一点的正确方法吗?


只需在复选框上设置value='true',并在方法签名中添加参数boolean taken即可进行绑定。 - ahmet alp balkan
3个回答

12

被接受的答案实际上并不完全正确,因为它没有处理“未选中”的情况。要处理这两种情况,您需要一个隐藏域:

<input id="gift_Taken" type="checkbox" name="gift.Taken" ${gift.Taken ? 'checked':''}  />
<input type="hidden" name="gift.Taken" value="false" />

注意放置顺序很重要,因此隐藏字段必须在复选框之后。

编写自定义模板标签可轻松避免忘记隐藏输入项(将其放入views/tags/checkbox.html中):

<input id="${_id}" type="checkbox" name="${_name}" value="true" #{if _checked} checked="checked" #{/if}>
<input type="hidden" name="${_name}" value="false">

然后按照以下方式调用此模板:

#{checkbox id:'gift_Taken', name: 'gift.Taken', checked: gift.Taken /}

请参阅Play框架列表中相关讨论:https://groups.google.com/forum/?fromgroups=#!topic/play-framework/HygQuYF3a8E


虽然不是理想的解决方案,但另一个解决方法是在模型中使用false作为默认值,如果没有提交复选框的值,将隐式地被解释为false。这个做法存在很多问题,但还是值得一提。 - chris
1
感谢您提供的订购提示(例如,在PHP中,使用相同的解决方案,但隐藏字段位于复选框之前)! - Bachi

9

如果值为true,你只需设置复选框的checked值。

例如(假设从视图中传递的对象名为gift,布尔值称为Taken):

<input id="gift_Taken" type="checkbox" name="gift.Taken" ${gift.Taken ? 'checked':''}  />

1
完美 - 我喜欢三元运算符 ;-) 顺便说一下,我要去买你的那本书。 - Rob Cowell
1
Groovy中的三元运算符更加强大。请查看Elvis运算符http://groovy.codehaus.org/Operators#Operators-ElvisOperator%28%3F%3A%29 - Codemwnci
我尝试过这个,但它没有起作用。我尝试了<input type="checkbox" ${true ? 'checked' : ''} />,所以它应该一直被选中。但是它并没有。有什么想法为什么会这样吗? - Dao Lam
@DaoLam,可能已经晚了,但Play 2.0需要使用类似@if(gift.Taken) { "checked" }的东西。我怀疑这个答案是旧版本的,不使用@在模板中编写代码。 - Kat

0

如果您能够使用JavaScript,您可以使用以下代码:

$(document).ready(function() {
    $( ":checkbox" ).each(function() {
        var name = $(this).attr("name");
        if(typeof(name) != "undefined") {
            var checkboxString = "";
            checkboxString = '<input type="hidden" style="display:none;" name="'+ name +'" value="false" />'
            $(this).after(checkboxString);
        }
    });
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接