看起来很简单,但显然很难。将(有限且已知长度)系列复选框绑定到grails命令对象上的布尔列表。当然可以“填充”命令对象以使用先前选择的值恢复视图。
例如我有一个grails webflow。它首先将4个复选框绑定到布尔列表中的条目。它切换到下一个状态并打印值 - 例如[真,真]。向后导航,所有复选框都为空(这非常有意义 - 4个复选框,只有两个值)。所以它应该是例如[false,true,false,true]。
无论我做什么,我似乎都无法实现这一目标。在春天它会很容易,只需将复选框绑定到值[0] .. [3] ...为什么在Grails中这么简单这么简单?!
请帮助,这真的会让我的一天成真!
示例命令Obj:
class TestCmdObj {
List<Boolean> boolListOne = []
}
控制器中的示例绑定方法(在流程操作中执行的闭包):
private def doBindAndValidateBoolList = {
bindData(flow.testCmdObj, params, [include:['boolListOne']])
}
到目前为止一切顺利。这实际上在流程中显示下一页时有效,testCmdObj.boolListOne对于选中的复选框显示为true。
GSP代码很简单,使用:
<g:checkBox name="boolListOne"/>
<g:checkBox name="boolListOne"/>
<g:checkBox name="boolListOne"/>
<g:checkBox name="boolListOne"/>
在下一个视图中,我可以打印出$ {testCmdObj.boolListOne}并打印出尽可能多的“真实”值,就像我检查的那样..(例如[true,true])如果我向后导航,则复选框是emtpy ......我再也能理解,因为它们都有相同的名字......
答案 0 :(得分:0)
好的,所以以this为参考:
Grails需要一个包含现有列表的命令,该命令将被填充 来自请求的数据。
所以你需要做的是:
<击>
class TestCmdObj {
列表boolListOne = ListUtils.lazyList([],FactoryUtils.instantiateFactory(Boolean))
}
击>
此外,您的gsp需要迭代您的命令以显示每个条目,例如:
<g:each in="${myCommandInstance.boolListOne}" var="boolInstance" status="i">
<g:checkbox name="boolListOne[${i}]" value="${boolInstance}" />
</g:each>
这样,gsp中的每个复选框都将对应列表中的一个条目。
编辑:似乎对于原始类型的包装器,不需要使用工厂。
答案 1 :(得分:0)
希望最终确定上述建议/评论之间的所有内容。
<g:each in="someIteration" var="a">
<g:checkBox name="something" value="${a.someCondition}"
checked="${a.someCondition}" />
</g:each>
您的控制者将在
String[L]
有点像String[] something
的验证对象
尽管您仍将其声明为List something=[]
。
只要最终用户选择了多个复选框,此方法也将起作用。并且您的验证对象将在此时List something=[]
上述问题是,如果选择1,则该参数以string
而不是list
的形式被接收
如果您不依赖于对象的自动绑定,那么上面的操作没什么问题,
List myList = params.list('something')
这时,grails会将1或倍数转换为列表。但这不会将单个复选框绑定到验证列表元素。
要从验证的角度解决此问题,将其声明为List something=[]
<g:each in="someIteration" status="i" var="a">
<g:checkBox name="something[${i}]" value="${a.someCondition}"
checked="${a.someCondition}" />
</g:each>
现在,无论选择1个复选框还是多个复选框,都将在something
之类的['null','whatever','null','null']
列表下进行选择。
使用status
字段并将名称从something
重命名为something[${i}]