1

这看起来很简单,但显然很难。将一系列(有限且已知长度)复选框绑定到 grails 命令对象上的布尔值列表。当然应该可以使用先前选择的值“填充”命令对象以恢复视图。

例如,我有一个 grails webflow。它首先将 4 个复选框绑定到布尔列表中的一个条目。它切换到下一个状态并打印值 - 例如 [true,true]。向后导航,所有复选框都是空的(这非常有意义 - 4 个复选框,只有两个值)。所以它应该是例如 [false, true, false, true]。

无论我做什么,我似乎都无法做到这一点。在春天,这很容易,只需将复选框绑定到 value[0]..[3]... 为什么在 Grails 中这么简单的事情这么难?!

请帮忙,这真的会让我很开心!

示例命令对象:

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]) 如果我向后导航,复选框是空的。 .. 再说一次,我可以理解,因为它们都具有相同的名称...

4

2 回答 2

0

好的,所以以此为参考:

Grails 需要一个具有现有列表的命令,该命令将填充来自请求的数据。

所以你需要做的是:

类 TestCmdObj {
List 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 中的每个复选框都将对应为列表中的一个条目。

编辑:对于原始类型的包装器,似乎不需要使用工厂。

于 2012-12-11T23:13:04.987 回答
0

希望在上述建议/评论之间完成所有工作。

  1. 如果您声明复选框的迭代并调用它们
<g:each in="someIteration" var="a">
  <g:checkBox name="something" value="${a.someCondition}" 
  checked="${a.someCondition}" />
</g:each>

您在 grails 中的控制器会将其拾取为 String[L] 有点像的验证对象,String[] something 尽管您仍将其声明为List something=[].

只要最终用户选择了超过 1 个复选框,这似乎也有效。并且您的验证对象将在此时拾取 List something=[]

上面的问题是,如果进行了 1 次选择,则接收到的参数更多是 astring而不是 alist

如果您不依赖对象的自动绑定,那么上面没有错,因为您会这样做

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字段并将名称重命名somethingsomething[${i}]

于 2019-04-16T13:32:04.297 回答