我正在使用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方法,只适用于旧版本。
我希望有人有同样的问题并且可以给我一个提示
提前致谢
答案 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将显示一个表单...
接下来的几天我将检查我的代码以获得真正的动态行为。如果我有结果,我会在这里将它们添加到主题中。