我只是浪费了半天试图解决这个问题,阅读了一些解决方法,并且认为“它不会那么糟糕 - 在Grails编辑集合时必须要直截了当,使用脚手架视图或我的自己的“。
假设我有这个域名对象:
class TreeGroup {
String name
List<Tree> trees
static hasMany = ['trees': MyTree]
}
只是为了解释数据结构的选择 - 我需要我的记录是唯一的,但按照我设置的顺序。这就是我选择List的原因,AFAIK不能依赖于Set中的顺序。所以这个问题有2个部分 - 1)如何从任何Collection中删除,例如Set,2)是List在这个上下文中保留Set的最佳替代(保留顺序)。
我希望能够创建一个没有树的组记录并进行4次更新:
显然,我希望每一步都能达到理想状态。目前,我只能添加记录,如果我甚至编辑/保存到列表,列表元素会再次添加到列表中。
我正在使用多重选择标记。它看起来像这样:
<g:select name="trees" from="${allTrees}" optionKey="id"
multiple="true" class="many-to-many"
value="${trees ? trees*.id : treeGroupInstance?.trees*.id}" />
这很好,从某种意义上说,它会在更新时生成带有这些变量的HTTP头:
_method:PUT
version:19
name:d5
trees:1
_action_update:Update
但数据绑定器只添加新元素,它永远不会让你编辑列表。
最干净的方法是什么?是我,不是阅读明显的东西,还是这是grails数据绑定的设计缺陷(以及何时/如何修复)?
是否有一种方法可能通过隐藏的HTTP参数在(重新)添加元素之前清除列表?
由于
答案 0 :(得分:1)
我最终这样做了:
private repopulate(def domainObject, String propertyName, Class domainKlaz) {
if (params[propertyName] != null) {
domainObject[propertyName].clear()
domainObject[propertyName].addAll(
params[propertyName].collect { domainKlaz.get(it) }
)
}
}
我在save()之前的更新控制器方法中为每个集合调用它。 OMG多么丑陋。