我有简单的层次结构。
class Atom { String value}
class Unit {
List atoms
static hasMany = [ atoms:Atom ]
String name
}
class Block {
List unitss
static hasMany = [ units:Unit ]
String name
}
假设我想创建一个块,其中包含两个单元,每个单元有两个原子。所以,首先,我创建了四个原子形式的原子。然后,我创建两个单元,并选择以前创建的原子。最后,我创建块并选择以前创建的单元。这不方便,所以我想以单一形式移动所有创建逻辑。我使用了这篇文章中的方法http://www.2paths.com/2009/10/01/one-to-many-relationships-in-grails-forms/
简而言之,我在 Block 类中添加了方法:
def getExpandableUnitList() {
return LazyList.decorate(units,FactoryUtils.instantiateFactory(Unit.class))
}
另外,我添加了调用js函数的按钮:
var unitCount = ${blockInstance?.units.size()} + 0;
function addUnit()
{
var htmlId = "unit" + unitCount;
var deleteIcon = "${resource(dir:'images/skin', file:'database_delete.png')}";
var templateHtml = "<div id='" + htmlId + "' name='" + htmlId + "'>\n";
templateHtml += "Unit "+ (unitCount + 1) + "\n";
templateHtml += "<input type='hidden' id='expandableUnitList[" + unitCount + "].name' name='expandableUnitList[" + unitCount + "].name' />\n";
templateHtml += "<span onClick='$(\"#" + htmlId + "\").remove();'><img src='" + deleteIcon + "' /></span>\n";
templateHtml += "</div>\n";
$("#UnitList").append(templateHtml);
unitCount++;
}
现在,我可以用一种形式创建带有单元的块(见下图,抱歉形式设计不佳)
表格 1 http://imageshack.us/a/img833/8775/screenshotfrom201210241.png
但是,这种形式也不方便——我们不能将原子添加到单元中。
因此,我在单元类中添加了lazylist,并添加了另一个具有几乎相同js代码的按钮。现在,我有这个:
表格 2 http://imageshack.us/a/img31/8775/screenshotfrom201210241.png
但是,当我创建此表单时 - 它不会保存我的原子。这是预期的行为,因为我们单元的惰性列表不知道原子的惰性列表。我不知道如何管理它。我唯一尝试过的 - 下面的代码,但它不起作用。
templateHtml += "<input type='hidden' id='expandableBlockList[" + blockId + "].add(expandableUnitList[" + unitCount + "].name)' name='expandableBlockList[0].add(expandableUnitList[" + unitCount + "].name)' />\n";
所以。我的问题是 - 如何以单一形式创建多个嵌套对象?