【发布时间】:2015-01-15 19:20:09
【问题描述】:
我们在此处用于大型动态表单的一种模式是允许客户端编辑几乎整个图形,包括子图形,并且子图形的删除和添加是在 javascript 中处理的。失败的用例是当用户删除其中一个孩子的属性时,对于这个例子,我们会说第二个孩子的电子邮件地址被删除并且parm被发送为空。
示例类结构
域 X
Long id
String name
SortedSet<Child> children
域子
Long id
Integer position // used to sort
String name (required)
String email (required)
Parms 以这种方式命名:
x.id = 1
x.name = 'blah'
x.children[0].id = 1
x.children[0].position = 0
x.children[0].name = 'childa0'
x.children[0].email = 'child0@any.com'
x.children[1].id = 2
x.children[1].position = 1
x.children[1].name = 'child1'
x.children[1].email = ''
当前存储的值:
x.id = 1
x.name = 'blah'
x.children[0].id = 1
x.children[0].position = 0
x.children[0].name = 'childa0'
x.children[0].email = 'child0@any.com'
x.children[1].id = 2
x.children[1].position = 1
x.children[1].name = 'child1'
x.children[1].email = 'child1@any.com'
要更新的模式是:
浏览器
- 用户编辑所有并提交更改
- parms 如上所示发送,在此用例中,用户意外删除了所需的电子邮件地址(是的,在这种简单的情况下可以阻止提交,但有更广泛的验证规则,这只是一个说明问题的简单示例)
服务器
- 使用 id parm 检索当前父域类
- 对照编辑的版本检查当前存储的版本,并确保它没有改变
- 以这种方式将所有参数应用于当前域对象:x.properties = parms.x
这就是它崩溃的地方。在 Grails 2.2.2 中,child[1] 的 email 属性被更新为空字符串,并且运行验证会捕获错误。 Grails 2.4.4 不会更新子值。我知道数据绑定发生了变化,也许这种变化有正当的理由,但我无法理解。这从 1.3.6 到 2.2.2 都有效。
需要注意的一点是,如果我不检索域类,而是使用传入的参数创建一个新实例,则所有子参数都设置正确。
X x = new X(params.x)
这似乎表明了一些 Grails 问题,因为用户指南谈到这两种方法是相同的 - 一种用于新实例,另一种用于更新,但示例清楚地表明这两种方法都应处理索引子属性。
感谢任何帮助或想法!
【问题讨论】:
-
看看这是否有帮助。 stackoverflow.com/questions/27974665/…
-
谢谢 - 我的用例完全不同,但这让我也尝试创建一个自定义活页夹,这反过来又让我在我的代码中发现了一个问题。我没有在页面中隐藏孩子的 ID,这让我想知道它以前是如何工作的!我猜旧版本的 grails 只是根据下标 [0]、[1] 等将所有数据放在子项中。Grails 2.4.4 显然希望匹配 ID,这是有道理的。
标签: grails data-binding upgrade