1

我有简单的层次结构。

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";

所以。我的问题是 - 如何以单一形式创建多个嵌套对象?

4

1 回答 1

1

查看 Grails 文档 - 特别是有关Gorm 级联行为的部分,它解释了您要查找的内容。

... 无论是一对一、一对多还是多对多,定义 belongsTo 都会导致更新从拥有类级联到其依赖类(关系的另一端),并且对于多/一对一和一对多关系删除也将级联。

如果您没有定义 belongsTo 则不会发生级联,您将不得不手动保存每个对象(一对多的情况除外,在这种情况下,如果新实例在 hasMany 集合中,保存将自动级联) .

编辑:

顺便说一句 - 不确定这是否是错字,但您的块定义不包含任何单位

我很快提交了一个答案,可能应该多加考虑 - 听起来你的问题更多是在表单方面而不是域定义。目前,当您的域被定义时,您应该能够在创建 Unit 时创建一个 Atom 以及它与 Unit 的关系。这是一个非常简单的表格来说明您在如何定义输入方面需要做的事情。

<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=""/>
于 2012-10-24T16:32:15.320 回答