gpt4 book ai didi

spring - 处理grails中一对多关系的动态表单参数

转载 作者:行者123 更新时间:2023-12-02 14:05:09 25 4
gpt4 key购买 nike

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

我已经设法破解了一个表单,该表单允许我在一个动态表单中创建下面显示的域对象,因为没有必要使用单独的表单来创建电话号码然后将它们分配给联系人,因此只需在我的应用程序中以一种形式创建所有内容。我设法实现了类似于我在 Previous Question 中提出的要求。 (感谢提供帮助的人)

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]
}

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

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

我的 Controller 有看起来像这样的代码块(这被剥离了,只是为了说明一点)
//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 对象是否有效,如果是,我在哪里可以找到更多关于此的信息,我在搜索过程中找到的所有示例都处理一对一关系,我找不到一对多的例子?
  • 在这种情况下,就编辑联系人对象时添加/删除电话而言,处理电话关系的最佳方法是什么。我的意思是创建逻辑很简单,因为我必须始终在保存时创建新手机,但是在处理更新联系人时,用户可能已经移除了手机和/或编辑现有手机和/或添加了一些新手机。现在我所做的只是删除联系人拥有的所有电话并根据表单发布的内容重新创建它们,但我觉得这不是最好的方法,我也不认为循环现有的那些并与发布的值进行比较并进行手动差异也是最好的方法,是否有关于如何处理这个问题的最佳实践?

  • 谢谢,希望问题很清楚。

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

    最佳答案

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

    better way for dynamic forms .作者说:

    To add LineItems I have some js that calculates the new index and adds that to the DOM. When deleting a LineItem i have to renumber all the indexes and it is what i would like to avoid



    所以我做什么

    我有一个存储下一个索引的变量
    var nextIndex = 0;

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

    静态添加子

    我创建了一个存储模板的变量(通知 {index} )
    var child   = "<div>"
    += "<div>"
    += "<label>Name</label>"
    += "<input type="text" name=\"childList[{index}].name\"/>"
    += "</div>"
    += "</div>"

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

    另见 Add and Remove HTML elements dynamically with Javascript

    动态添加 child

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

    通过删除

    但我认为这是删除时长大的问题。无论您删除多少 child ,都不会触及 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"/>

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

    在服务器端,我使用 AutoPopulatingList。因为 childList 1已被删除,AutoPopulatingList 将其处理为 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();
    }
    });

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

    关于添加/删除你可以看到这个 link我在这里展示了一个场景,它可以给你一些洞察力。

    另见 Grails UI plugin

    关于spring - 处理grails中一对多关系的动态表单参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3505023/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com