Grails一对多数据绑定与动态形式

时间:2014-03-18 13:25:43

标签: forms grails data-binding groovy

我正在使用Grails 2.3.5并尝试保留来自动态表单的多个域。

为实现这一目标,我使用了惰性列表的方法,如:http://omarello.com/2010/08/grails-one-to-many-dynamic-forms/

中所述

表格生成良好,所有必要的参数都在params-map中, 但是对列表的绑定不起作用。

我在过去两天读了很多关于这个主题的内容,并在stackoverflow上找到了很好的答案, 但我认为这些方法仅适用于较旧的grails版本。

为了说明我的问题,有些代码:

House.groovy

class House {

....attributes removed to minimize example


List<Adress> adresses = [].withLazyDefault { new Adress() }
// List adresses = ListUtils.lazyList(new ArrayList<Adress>,FactoryUtils.instantiateFactory(Adress.class)); 
static hasMany = [adresses:Adress]


      //def getAdresses(){
      //return LazyList.decorate(adresses, FactoryUtils.instantiateFactory(Adress.class))
      //}   

static mapping = {
    adresses cascade:"all-delete-orphan"
}

动态表单的模板 - &gt;是否正确创建

<div id="adress${i}" class="adresses-div" style="<g:if test="${hidden}">display:none;</g:if>margin-bottom:10px; ">
<g:hiddenField name='adresses[${i}].id' value='${adresses?.id}'/>
<g:hiddenField name='adresses[${i}].deleted' value='false'/>
<g:hiddenField name='adresses[${i}].neu' value="${adresses?.id == null?'true':'false'}"/>

<g:textField name='adresses[${i}].street' value='${adresses?.street}' />
<g:textField name='adresses[${i}].land' value='${adresses?.land}' />    

<span class="del-adresses">
    <img src="${resource(dir:'images/skin', file:'database_delete.png')}" 
        style="vertical-align:middle;"/>
</span>

HouseController - 编辑动作

houseInstance.properties = params

因此,表单模板正确创建,输入值存在于参数图中。

我的问题是现在是从一个表单创建的多个地址的数据绑定。 根据上面链接提供的示例项目,参数绑定应自动创建新的Adress-Objects并将其保存为房屋的子项。

调试我的应用程序时,我可以看到有正确的参数,但似乎列表无法创建新的Adress-Object。

'adresses'列表,绑定后包含空值 - &gt; [空]

如上所述,我尝试了一些解决此问题的方案,但无法解决。 Grails 2.3.5可能不支持lazylist方法,只适用于旧版本。

我希望有人有同样的问题并且可以给我一个提示

提前致谢

2 个答案:

答案 0 :(得分:2)

我有同样问题的经验。 请参阅:grails 2.3 one-to-many databinding with dynamic forms

如果是新手机,请尝试删除参数中的id:。用grails 2.3.11测试并在我的项目中使用它。

以下是我在_phone.gsp

中所做的更改
<div id="phone${i}" class="phone-div" <g:if test="${hidden}">style="display:none;"</g:if>>
     <g:if test="${phone?.id != null}">
           <g:hiddenField name='phones[${i}].id' value='${phone?.id}'/>
     </g:if>
     ...
</div>

感谢@ hakuna1811

答案 1 :(得分:0)

在仔细阅读grails 2.3.x的文档后,我看到参数图应该如何与多个子域一起使用。

示例:

def bindingMap = [name: 'Skyscraper', 
              'addresses[0]': [street: 'FirstStreet'], 
              'addresses[1]': [street: 'SecondStreet']]

但我的地图看起来像这样:

def bindingMap = [name: 'Skyscraper', 
              'addresses[0]': [street: 'FirstStreet', 'SecondStreet']]

我以前从未注意到这一点......

问题是克隆所有必要输入字段和更新的jQuery代码 相应的ids。通过删除此代码并使用两个静态地址字段测试我的应用程序,我得到了它。

<g:textField name="adresses[0].street" value=""/>
<g:textField name="adresses[0].zip" value=""/>


<g:textField name="adresses[1].street" value=""/>
<g:textField name="adresses[1].zip" value=""/>

作为一个短期解决方案,我决定创建预定义的隐藏表单。单击add-Button时,一些简单的jQuery将显示一个表单...

接下来的几天我将检查我的代码以获得真正的动态行为。如果我有结果,我会在这里将它们添加到主题中。