привязка данных объекта команды - PullRequest
1 голос
/ 06 декабря 2011

Я пытаюсь использовать объекты команд следующим образом:

class BeneficiaryCommand {
    List<Beneficiary> tempBeneficiaries = org.apache.commons.collections.list.LazyList.decorate(new ArrayList(), new org.apache.commons.collections.functors.InstantiateFactory(Beneficiary.class))

    static constraints = {
        tempBeneficiaries(validator: {
            it.each{println it.beneficiary} // it.beneficiary is null, but I expect it to have name and address from the form
        })
    }
}

class Beneficiary {
    Contractor beneficiary // Contractor has name and address properties, both non-blank and non-nullable
    Boolean save
}

GSP выглядит так:

<tr class="prop">
    <td valign="top" class="name">
      <label for="beneficiaries"><g:message code="contract.beneficiaries.label" default="New Beneficiary Name" /></label>
    </td>
    <td valign="top" class="value ${hasErrors(bean: i, field: 'name', 'errors')}">
        <g:textField name="tempBeneficiaries[0].name" />
    </td>
</tr>

<tr class="prop">
    <td valign="top" class="name">
      <label for="beneficiaries"><g:message code="contract.beneficiaries.label" default="New Beneficiary Address" /></label>
    </td>
    <td valign="top" class="value ${hasErrors(bean: i, field: 'address', 'errors')}">
        <g:textField name="tempBeneficiaries[0].address" />
    </td>
</tr>

<tr class="prop">
    <td valign="top" class="name">
        </td>
    <td valign="top" class="value ${hasErrors(bean: beneficiaryCommand, field: 'save', 'errors')}">
        <div id="newBeneficiaryFlagDisplay"><g:checkBox name="tempBeneficiaries[0].save" /> Create new Beneficiary</div>
    </td>
</tr>

Свойство save объекта команды (представленное флажком) привязано к объекту команды, но name и address - нет. Я также попытался переименовать имена текстовых полей в tempBeneficiaries.beneficiary[0].name, но безрезультатно.

Есть какие-нибудь идеи о том, как захватить name и address в объект команды?

1 Ответ

4 голосов
/ 06 декабря 2011

Из иерархии вашего командного объекта имя поля должно быть tempBeneficiaries[0].beneficiary.name и tempBeneficiaries[0].beneficiary.address

Это синтаксис LazyList, который я использовал ранее, чтобы сделать что-то подобное, но я не знаю, является ли ваш синтаксис проблемой вообще:

List<Beneficiary> copies = ListUtils.lazyList([], FactoryUtils.instantiateFactory(Beneficiary))

Также вы можете попробовать

Contractor beneficiary = new Contractor()

в вашем классе Beneficiary, чтобы объект был доступен во время создания объекта для заполнения.

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