forms - Grails 具有动态表单的一对多数据绑定(bind)

标签 forms grails data-binding groovy

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

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

表格生成得很好,所有必要的参数都在 params-map 中,
但绑定(bind)到列表不起作用。

过去两天我读了很多关于这个话题的文章,并在 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"
}

动态表单模板 --> 正确创建
<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 - 编辑 Action
houseInstance.properties = params

因此,表单模板已正确创建,并且输入值存在于参数映射中。

我现在的问题是从一个表单创建的多个地址的数据绑定(bind)。
根据上面链接提供的示例项目,参数绑定(bind)应该会自动创建新的地址对象并将它们保存为房子的子对象。

在调试我的应用程序时,我可以看到有正确的参数,但似乎列表无法创建新的地址对象。

“地址”列表,绑定(bind)后包含空值--> [null]

如上所述,我为这个问题尝试了一些解决方案,但无法解决它。
可能在 grails 2.3.5 中不支持惰性列表方法,并且仅适用于旧版本。

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

提前致谢

最佳答案

我有同样问题的经验。
引用: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

关于forms - Grails 具有动态表单的一对多数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22480803/

相关文章:

php - 如何检索不同 php-html 页面上同一个表的最后插入的自动生成的 id

javascript - 如何知道表单输入是否为空(React Hooks)

authentication - 在 Controller 中验证用户并将 session 发送到前端

data-binding - MvvmCross:更改 MonoDroid 上绑定(bind)的更新源触发属性

php - php登录表单验证问题

javascript - 提交输入不会在 IE 和 Firefox 中发布

grails - 贝壳和瓶盖

sql - Groovy SQL 忽略动态 select 语句中的 order by 子句

wpf - 当绑定(bind)值发生变化时,启动动画的最佳方式是什么?

c# - ListBox 未正确更改 ContentControl 的 ViewModel