Как связать / обновить весь InstanceList в контроллере? - PullRequest
0 голосов
/ 28 декабря 2010

Я новичок в Граале, и у меня следующий запрос.

Проблемный домен:

  • Класс родительского домена имеет логическое значение временное свойство "isValid".

  • Дочерний домен имеет логическое свойство "IsValid".

  • Parent / list.gsp позволяет пользователям изменять Свойство isValid родительского экземпляра в ParentInstanceList, через обновление функция в ParentController, который я можно в дальнейшем использовать для установки каждого родителя детская собственность "isValid".

Класс родительского домена

class Parent {

String name
boolean isValid = false

static hasMany = [children:Child]
static transients =['isValid']

}

Класс дочернего домена

class Child {

String name
boolean isValid
Parent parent

static belongsTo = [parent:Parent]

}

родитель / list.gsp

    <g:form method="post" action="update" >
    <div class="list">
        <table>
            <thead>
                <tr>

                    <g:sortableColumn property="id" title="${message(code: 'parent.id.label', default: 'Id')}" />

                    <g:sortableColumn property="name" title="${message(code: 'parent.name.label', default: 'Name')}" />
                     <g:sortableColumn property="isValid" title="${message(code: 'parent.isvalid.label', default: 'isValid?')}" />

                </tr>
            </thead>
            <tbody>
            <g:hiddenField name="parentInstanceList" value="${parentInstanceList }"/>
            <g:each in="${parentInstanceList}" status="i" var="parentInstance">

                <tr class="${(i % 2) == 0 ? 'odd' : 'even'}">

                    <td><g:link action="show" id="${parentInstance.id}">${fieldValue(bean: parentInstance, field: "id")}</g:link></td>

                    <td>${fieldValue(bean: parentInstance, field: "name")}</td>
                    <td>
                    <g:checkBox name="isValid" value="${parentInstance?.isValid }"/>
                    </td>

                </tr>
            </g:each>
            </tbody>
        </table>
    </div>
    <div class="paginateButtons">
        <g:paginate total="${parentInstanceTotal}" />
    </div>

    <div class="buttons">
        <span class="button">
            <g:actionSubmit class="update" action="update" value="${message(code: 'default.button.update.label', default: 'update')}" />
        </span> 
    </div>

Родительский снимок / list.gsp: http://img156.imageshack.us/i/parentlistview.png/

Запрос: Как я могу отследить, какое свойство parentInstance "isValid" не проверено / не отмечено, что я могу легко установить дочернее свойство родителя "isvalid".

def parentInstanceList  = params.parentInstanceList
    parentInstanceList.each {
        Parent parent = it
        parent.children.each{
            Child child = it
            child.isValid=parent.isValid
        }
    }

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

Parent parentInstance = Parent.get(params.id)
 parentInstance.properties = params

заранее спасибо

Рехман * * тысяча пятьдесят-одна

1 Ответ

0 голосов
/ 28 декабря 2010

Я предпочитаю отображать для каждой строки специально названный флажок:

<g:checkBox
        name="Parent_${parentInstance.id}"
        value="${parentInstance.isValid ? 'on' : 'off'}" />

, а затем собирать все отмеченные флажки:

def update = {
    Collection<Parent> checked = params.collect{ Map.Entry that ->
        that.value != "on" ? null : getParentForCheckbox(that.key)
    }.findAll{ it != null }

    ... // and then assign 'isValid' by hand
}

Вы можете использовать свойства массива, чтобы он,Назовите флажки как parentInstanceList[0], а затем присвойте properties = params какому-либо объекту со свойством parentInstanceList, но это подвержено ошибкам: у вас нет гарантии, что parentInstanceList, который вы отобразили в HTML, будет таким же, как тот, который вы назначаетесвойства к.

...