复选框列表

zor*_*119 9 grails

我有两个域类

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列表中有元素,有重复的语句......).

知道怎么做到这一点?

Pet*_*ook 6

这是可能的,但它确实需要一点点黑客攻击.首先,每个复选框必须具有相同的名称,"语句":

<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)

复选框支持尚未针对此用例设计,因此需要进行黑客攻击.多选列表框是通常用于此类场景的列表框.