2012-10-24 84 views
1

我只是簡單的層次結構。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"; 

所以,我的問題是 - 如何以單一形式創建多個嵌套對象?

回答

1

看一看Grails文檔 - 特別是關於Gorm cascading behavior的部分,它解釋了你在找什麼。

...無論是一比一,一到多或多到多,定義屬於關聯將導致更新自己所屬的類級聯到其相關(對方的關係),並且對於許多/一對一和一對多關係的刪除也會級聯。

如果不定義屬於關聯則沒有級聯會發生,你必須手動保存每個對象(除的一個一對多的情況下,在這種情況下,可以節省將如果自動級聯新實例位於hasMany集合中)。

編輯:

順便說一句 - 不知道這是一個錯字,但你的塊定義不包含任何單位

我很快提交一個答案,也許應該給它更多的思考 - 這聽起來像你的問題更多的是在形式方面與域定義。目前,由於您的域名已定義,因此您在創建單元時,應該能夠創建Atom及其與單元的關係。下面是一個非常簡單的表格,用於說明在如何定義輸入方面需要做的事情。

<form ... 
    Unit: <input type="text" name="name" value="" /> 
    Atom 1: <input type="text" name="atoms[0].value" value="" /> 
    Atom 2: <input type="text" name="atoms[1].value" value="" /> 
... 
</form> 

原子集合的大小是硬編碼的例子,但在一個更具擴展性的解決方案中,您可以動態地定義它們。所以在提交時,這將創建單元,它是2個原子。

編輯: 您是否嘗試過這樣的事情:

Block: <g:textField name="name" value=""/> 
<br /> 
Unit 1: <g:textField name="units[0].name" value=""/> atoms: 
<g:textField name="units[0].atoms[0].value" value=""/> 
<g:textField name="units[0].atoms[1].value" value=""/> 
<br /> 
Unit 2: <g:textField name="units[0].name" value=""/> atoms: 
<g:textField name="units[0].atoms[0].value" value=""/> 
<g:textField name="units[0].atoms[1].value" value=""/> 
+0

我剛剛更新爲你解答 – user553180

相關問題