我只是簡單的層次結構。Grails - 在單個表單中創建多個嵌套對象
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/
總之,我在課堂上阻止添加方法:
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++;
}
現在,我可以創建用一種形式的單元塊(見下圖,對不良形式設計抱歉)
Form 1 http://imageshack.us/a/img833/8775/screenshotfrom201210241.png
但是,這種形式也不方便 - 我們不能將原子添加到單位。
所以,我添加了lazylist單元類,並添加了幾乎相同的js代碼的另一個按鈕。 現在,我有這樣的:
Form 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";
所以,我的問題是 - 如何以單一形式創建多個嵌套對象?
我剛剛更新爲你解答 – user553180