私は単に階層を持っています。
class Atom { String value}
class Unit {
List atoms
static hasMany = [ atoms:Atom ]
String name
}
class Block {
List unitss
static hasMany = [ units:Unit ]
String name
}
それぞれ2つの原子を持つ2つのユニットを含む1つのブロックを作成するとします。そこで、まず、原子の形で4つの原子を作成します。次に、2つのユニットを作成し、以前に作成した原子を選択します。最後に、ブロックを作成し、以前に作成したユニットを選択します。便利ではないので、すべての作成ロジックを1つの形式で移動したいと思います。この記事のアプローチを使用しました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つのフォームのユニットでブロックを作成できます(下の画像を参照してください。フォームのデザインが悪いのでごめんなさい)
フォーム1http://imageshack.us/a/img833/8775/screenshotfrom201210241.png
ただし、この形式も便利ではありません。ユニットに原子を追加することはできません。
そこで、ユニットクラスにレイジーリストを追加し、ほぼ同じjsコードを持つ別のボタンを追加しました。今、私はこれを持っています:
フォーム2http://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";
それで。私の質問は、単一のフォームで複数のネストされたオブジェクトを作成する方法ですか?