список флажков - PullRequest
       0

список флажков

9 голосов
/ 05 января 2012

У меня есть два класса домена

class Contract {
    String number
    static hasMany = [statements:Statement]
}

class Statement {
    String code
    static hasMany = [contracts:Contract]
}

Я хотел бы показать все выписки, доступные в моем gsp, с флажком рядом с каждым, позволяя пользователю выбирать, какие выписки применимы к контракту. Так что-то вроде:

[ ] Statement Code 1
[ ] Statement Code 2
[ ] Statement Code 3

Я начал с этого:

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

Но я просто не могу получить список проверенных операторов в контроллер (в списке есть null элементов, есть повторные операторы ...).

Есть идеи, как этого добиться?

Ответы [ 4 ]

6 голосов
/ 06 января 2012

Это возможно, но требует некоторого взлома.Во-первых, каждый флажок должен иметь одно и то же имя, «операторы»:

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

Во-вторых, в контроллере необходимо удалить свойство «_statements» перед привязкой:

def contract = Contract.get(params.id)
params.remove "_statements"
bindData contract, params
contract.save(failOnError: true)

Поддержка флажка не была разработана для этого случая использования, следовательно, необходимость взлома.Окно списка с множественным выбором обычно используется для этого типа сценария.

2 голосов
/ 07 декабря 2012

Я лично предпочитаю получить список идентификаторов в этом случае.

<g:each var="book" in="${books}">
    <g:checkBox name="bookIds" value="${book.id}" ...
</g:each>

Объект команды:

class BookCommand {
    List<Serializable> bookIds
}

В действии контроллера:

BookCommand bc ->
    author.books = Book.getAll(bc.bookIds)
1 голос
/ 05 января 2012

Измените флажок на что-то вроде этого.

<g:checkBox name="statements.${statement.id}" value="true" checked="${contractInstance.statements.contains(statement)?:''}" />

и затем в контроллере, в params.statements вы получите список с идентификаторами проверенных операторов.

Также обратите внимание на ?:'' в свойстве зарегистрировано, это хорошая идея добавить его, потому что любое значение (даже «ложное») в проверяемом свойстве интерпретируется как проверенное.

0 голосов
/ 05 января 2012

Вы отображаете запрос непосредственно на Contract?Гораздо безопаснее отобразить входящий запрос в Command object.

Что касается отображения списка - значения отображаются только в существующие элементы.Я имею в виду, что он не может создавать новые элементы списка.Вы должны подготовить его перед картированием.Если вы знаете, что всегда есть 3 элемента, вы можете сделать:

class ContractCommand {

   List statements = [
       new Statement(),
       new Statement(),
       new Statement(),
   ]
}

и отобразить запрос на этот объект

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...