处理 Grails 中一对多关系的动态形式参数

2023-12-15

我在这里的主要问题是在一个动态表单中管理一对多关系时处理 pramas 映射,以及通过动态表单编辑/更新域对象时处理一对多的最佳实践。我的问题的输入如下。

我已经成功破解了一个表单,该表单允许我在一个动态表单中创建如下所示的域对象,因为没有必要使用单独的表单来创建电话号码,然后将它们分配给联系人,因此有意义在我的应用程序中以一种形式创建所有内容。我设法实现了类似于我在我的要求中所要求的东西上一个问题(感谢帮助过的人)

class Contact{

    String firstName
    String lastName
    // ....
    // some other properties
    // ...

    static hasMany = [phones:Phone]
    static mapping = {
        phones sort:"index", cascade: "all-delete-orphan"
    }
}

class Phone{
    int index
    String number
    String type
    Contact contact

    static belongsTo = [contact:Contact]
}

我基本上设法从“params”映射中获取值并自行解析它们并手动创建域对象和关联。 IE。我没有使用默认脚手架中使用的相同逻辑,即

Contact c = new Contact(params)

等等......,我只是循环遍历所有参数并手工制作我的域对象并保存它们,一切正常。

我的控制器具有如下所示的代码块(这是精简的,只是为了表明一点)

//create the contact by handpicking params values
def cntct = new Contact()
cntct.firstName = params.firstName
cntct.lastName = params.lastName
//etc...

//get array of values for number,type
def numbers = params['phone.number']
def types =  params['phone.type']

//loop through one of the arrays and create the phones
numbers.eachWithIndex(){ num, i ->
    //create the phone domain object from 
    def phone = new Phone()
    phone.number = num
    phone.type = types[i]
    phone.index = i
    cntct.addToPhones(phone)
}

//save

我的问题如下:

  • 处理这种情况的最佳实践是什么,在这种情况下使用 Command 对象是否有效,如果是,我在哪里可以找到有关此问题的更多信息,我在搜索过程中找到的所有示例都处理一对一关系,我找不到一对多的示例?
  • 在这种情况下,在编辑联系人对象时添加/删除电话方面,处理电话关系的最佳方法是什么。我的意思是创建逻辑很简单,因为我必须始终在保存时创建新手机,但是在处理更新联系人时,用户可能已删除手机和/或编辑现有手机和/或添加一些新手机。现在我所做的只是删除联系人拥有的所有电话并根据表单发布的内容重新创建它们,但我觉得这不是最好的方法,我也不认为循环现有的与发布的值进行比较并进行手动比较也是最好的方法,是否有关于如何处理这个问题的最佳实践?

谢谢,希望问题很清楚。

[edit] 只是为了获得更多信息,可以使用表单中的 javascript (jquery) 动态添加和删除电话信息 [/edit]


免责声明:我不知道使用 grails 时以下方法是否有效。稍后告诉我。

See 动态表单的更好方法。作者说:

为了添加 LineItems,我有一些 js 来计算新索引并将其添加到 DOM 中。删除 LineItem 时我必须重新编号所有索引这就是我想避免的

所以我做什么

我有一个存储下一个索引的变量

var nextIndex = 0;

加载页面时,我执行一个 JavaScript 函数,该函数计算集合有多少个子项并配置 nextIndex 变量。您可以使用 JQuery 或 YUI,随意。

静态添加子项

我创建一个存储模板的变量(注意{index})

var child   = "<div>"
           +=     "<div>"
           +=         "<label>Name</label>"
           +=         "<input type="text" name=\"childList[{index}].name\"/>"
           +=     "</div>"
           += "</div>"

当用户点击添加孩子按钮,我替换{index}- 通过使用正则表达式 - 通过存储在 nextIndex 变量中的值并加一。然后我添加到 DOM

也可以看看使用 Javascript 动态添加和删除 HTML 元素

动态添加子项

Here你可以看到 Paolo Bergantino 解决方案

通过删除

但我认为这是删除时出现的问题。无论您删除多少个子级,都不会触及 nextIndex 变量。看这里

/**
  * var nextIndex = 3;
  */

<input type="text" name="childList[0].name"/>
<input type="text" name="childList[1].name"/> // It will be removed
<input type="text" name="childList[2].name"/>

假设我删除子列表1我做什么 ???我应该重新编号所有索引吗???

在服务器端我使用 AutoPopulatedList。因为子列表1已被删除,自动填充列表将其处理为 null。所以在初始化时我做

List<Child> childList = new AutoPopulatingList(new ElementFactory() {
   public Object createElement(int index) throws ElementInstantiationException {
       /**
         * remove any null value added
         */    
       childList.removeAll(Collections.singletonList(null));

       return new Child();
   }
});

这样,我的集合只包含两个子项(没有任何空值)和我不需要对客户端的所有索引重新编号

关于添加/删除你可以看这个link我展示了一个场景,可以给您一些见解。

也可以看看Grails UI 插件

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

处理 Grails 中一对多关系的动态形式参数 的相关文章

随机推荐

  • android.content.res.Resources$NotFoundException:资源 ID #0x0 java 异常

    当运行尝试显示对象的 ListView 的片段时会发生此异常 我已经研究了该异常 但其他情况的解决方案似乎与 setText 函数有关 或者尝试将字符串以外的任何内容显示为字符串 我真的不知道还能说什么 提前致谢 Java类 import
  • 从 ASP.NET MVC2 应用程序执行 Ajax 调用时出现问题

    我正在将现有的 ASP NET 应用程序转换为 MVC2 并且我有一个使用 Ajax 通过 jQuery 调用的现有方法 该方法以前可以工作 但现在不起作用 因此 由于使用 MVC2 我似乎需要做一些我无法弄清楚的更改 我已经降低了代码的复
  • Windows 应用程序可以选择用 C++ 写入控制台吗?

    我想要一个具有以下行为的 Windows 应用程序 1 如果它是从现有的命令行窗口 cmd exe 启动 那么它将其标准输出写入该控制台 2 如果通过双击其图标来启动它 则它不会打开新控制台 也不会在任何地方写入其标准输出 为了达到 1 我
  • 围绕画布中的中心点旋转图像

    围绕其中心旋转画布上的图像 我尝试了网上的一些例子 但失败了 如果我正在使用bitmap creatbitmap使用矩阵我收到错误 请建议我哪个更好 提前致谢 Aswan 您可以使用矩阵来旋转 首先设置位置 我使用位图中心的坐标 然后进行旋
  • 为什么 sed 不会从文件中删除行?

    我试图从文件中删除特定行 然后将编辑后的行附加到文件中 我得到了最后一部分 但我删除旧行的 sed 命令不起作用 sed userinput d file1 txt gt file2 txt 这最终会将所有文件内容添加到新文件中 而不仅仅是
  • 找到字符串的第一个字符,然后将其与符号C ++进行比较

    尝试检查字符串的第一个字符以查看它是否包含 string pathname test if pathname at 0 if first character is a slash then delete the slash but only
  • 每个源文件的标头

    我试图了解每个源文件方法的一个标头背后的目的 在我看来 标头用于共享函数声明 typedef使用它们的多个文件之间的 和宏 当你为你的头文件 c它的缺点是 每次您想要查看函数声明或宏时 您都需要引用头文件 并且通常更简单的是 所有内容都在一
  • 什么是 pro *c?

    这有什么用 我们如何从数据库中访问数据 Pro C 实际上是一个用 C 代码访问 Oracle 数据库的预编译器 您可以使用以下语句编写代码 int sal EXEC SQL SELECT salary INTO sal FROM empl
  • PHP Composer Autoload 出现类未找到错误

    错误是 Fatal error Uncaught Error Class Championsweb Model VO CompeticionVO not found in E Drive Proyectos ChampionsEclipse
  • 保存来自 url 的图像

    是否可以使用保存图像Visual Basic 2008从 URL 到我的电脑 例如 From www domain com image jpg to C folder image jpg P S 我需要最简单的代码示例 然后我将根据需要进行
  • 将 UISplitViewController 放在自己的 XIB 中?

    我的 iPad 应用程序以显示登录信息的普通 UIView 启动 用户登录后 屏幕应该切换到分割视图 然而 XCode 的 SplitViewTemplate 以及我在网上找到的所有示例 将 UISplitViewController 放置
  • R - 根据与现有列匹配的值索引创建新列数据框

    我有一个名为的数据框imp2 大约 6 000 行 其中有 9 列标记 savres1 savres9 每列中的值为 1 或 0 对于每一行 只有其中 1 列的值为 1 其余均为 0 我想创建一个名为的新专栏 savres 我将在其中放入一
  • API分页最佳实践

    我希望有人帮助我使用我正在构建的分页 API 来处理奇怪的边缘情况 与许多 API 一样 该 API 对大量结果进行分页 如果您查询 foos 您将获得 100 个结果 即 foo 1 100 以及指向 foos page 2 的链接 该链
  • VBA ADO 连接到 .xlsx 文件

    我正在尝试使用 ADO 连接从关闭的 Excel 2007 工作簿 xlsx 复制数据 我有连接字符串工作 但是 当我尝试打开记录集中的命令 倒数第二行 时 出现自动化错误 这在下面的代码中可能不太清楚 所以 wsSummary 是一个工作
  • 如何将 GWT UIBinder 与 Canvas 集成?

    我正在尝试使用 Google Web Toolkit 找到解决办法 现在我正试图得到一个Canvas小部件已启动并运行 但我收到此错误并且不明白为什么 Compiling module de kuntze HelloCanvas Compu
  • 如何在 C# 中创建整数序列?

    F has 序列允许创建序列 seq 0 10 创建从 0 到 10 的数字序列 C 中有类似的东西吗 您可以使用Enumerable Range 0 10 例子 var seq Enumerable Range 0 10 MSDN 页面h
  • Prolog IntList 定义

    如果 IntList 由单调递增的 gt 整数后跟单调递减的整数组成 hill IntList 成功 例如 gt 1 2 5 8 11 6 3 1 是一座小山 但 1 2 5 8 11 6 9 3 1 和 1 2 3 4 5 6 gt 不是
  • SSRS 2008 Word 导出无法横向打印

    我有许多 SSRS 2008 报告需要以横向模式导出到 word 导出时 报告看起来很棒 但当您尝试打印 甚至预览 页面时 Word 似乎尝试以纵向模式打印报告 因此会截断距离页面最左侧超过 8 5 英寸的所有内容 我已确保已进行以下设置
  • 画布像素数据的跨浏览器规范?

    有谁知道当前画布像素数据规范在各种浏览器中可以追溯到多远 如果 没那么远 之前的规格是什么 当你调用或推送像素时 你得到 发送 ImageData data Uint8ClampedArray width Number height Num
  • 处理 Grails 中一对多关系的动态形式参数

    我在这里的主要问题是在一个动态表单中管理一对多关系时处理 pramas 映射 以及通过动态表单编辑 更新域对象时处理一对多的最佳实践 我的问题的输入如下 我已经成功破解了一个表单 该表单允许我在一个动态表单中创建如下所示的域对象 因为没有必