我有两个域类
class Contract {
String number
static hasMany = [statements:Statement]
}
class Statement {
String code
static hasMany = [contracts:Contract]
}
Run Code Online (Sandbox Code Playgroud)
我想在我的gsp中显示所有可用的语句,每个语句旁边都有一个复选框,允许用户选择适用于合同的语句.所以类似于:
[ ] Statement Code 1
[ ] Statement Code 2
[ ] Statement Code 3
Run Code Online (Sandbox Code Playgroud)
我从这开始:
<g:each in="${Statement.list()}" var="statement" status="i">
<g:checkBox name="statements[${i}].id" value="${statement.id}" checked="${contractInstance.statements.contains(statement.id)}" />
<label for="statements[${i}]">${statement.code}</label>
</g:each>
Run Code Online (Sandbox Code Playgroud)
但我只是无法获得一个已检查语句的列表给控制器(null列表中有元素,有重复的语句......).
知道怎么做到这一点?
这是可能的,但它确实需要一点点黑客攻击.首先,每个复选框必须具有相同的名称,"语句":
<g:each in="${org.example.Statement.list(sort: 'id', order: 'asc')}" var="statement" status="i">
<g:checkBox name="statements" value="${statement.id}" checked="${contract.statements.contains(statement)}" />
<label for="statements">${statement.content}</label>
</g:each>
Run Code Online (Sandbox Code Playgroud)
其次,在控制器中,您必须在绑定之前删除"_statements"属性:
def contract = Contract.get(params.id)
params.remove "_statements"
bindData contract, params
contract.save(failOnError: true)
Run Code Online (Sandbox Code Playgroud)
复选框支持尚未针对此用例设计,因此需要进行黑客攻击.多选列表框是通常用于此类场景的列表框.
| 归档时间: |
|
| 查看次数: |
11863 次 |
| 最近记录: |