【问题标题】:Grails - creating multiple nested objects inside single formGrails - 在单个表单中创建多个嵌套对象
【发布时间】:2012-10-24 09:38:23
【问题描述】:

我只有层次结构。

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++;
}

现在,我可以用一种形式创建带有单元的块(见下图,对于糟糕的形式设计表示抱歉)

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

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

【问题讨论】:

    标签: grails


    【解决方案1】:

    查看 Grails 文档 - 特别是 Gorm cascading behavior 部分,它解释了您要查找的内容。

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

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

    编辑:

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

    我很快就提交了答案,并且可能应该多加考虑 - 听起来您的问题更多是在表单方面而不是域定义方面。目前,当您的域被定义时,您应该能够创建一个 Atom 以及在创建 Unit 时它与 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=""/>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-07
      • 1970-01-01
      相关资源
      最近更新 更多