【问题标题】:Grails GSP Loop through an index and do somthing with selected linesGrails GSP 循环遍历索引并对选定的行执行某些操作
【发布时间】:2017-03-01 13:32:09
【问题描述】:

在 Index-gsp 中,我希望能够选择任意数量的行,然后通过单击链接将所有这些行发送到控制器进行处理,例如创建不同类型的新对象。

我不知道如何进行选择或如何在 GSP 中收集这些选定的行。如果可能的话,也许我应该在每一行上使用一个复选框?

这是使用修改后的 index.gsp 显示的产品列表。 每个产品线前面都有一个复选框。 我想要的是列出被检查的产品列表,然后将此列表传输给控制器。

这个 index.gsp 的一部分:

        <li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li>
        <li><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></li>
        <li><g:link class="create" action="createOffer"><g:message code="default.new.label" args="[entityName]" params="toOffer" /></g:link></li>
    </ul>
</div>
<div id="list-prodBuffer" class="content scaffold-list" role="main">
    <h1><g:message code="default.list.label" args="[entityName]" /></h1>
    <g:if test="${flash.message}">
        <div class="message" role="status">${flash.message}</div>
    </g:if>
    <table>
        <thead>
            <tr>
                <td> Välj</td>
                <td> ID</td>
            </tr>
        </thead>
    <tbody>             
        <g:each in="${prodBufferList}" status="i" var="prodBuffer">
            <tr class="${ (i % 2) == 0 ? 'even': 'odd'}">
                                        <td><g:checkBox name="toOffer" value="${prodBuffer.id}" checked="false"  /></td>
                                        <td>${prodBuffer.id}</td>

所以这不是一个普通的表格,只是一个列表,我想使用链接将其传输到控制器。

我是初学者,不知道怎么做。

【问题讨论】:

    标签: loops grails checkbox gsp


    【解决方案1】:

    您可以使用 javascript 从页面收集所有必要的数据,然后将所有数据发送到您的控制器进行处理。 有很多方法可以做到这一点。 例如通过 JQuery 发送:

    <script>
    
    //some code
    
    var items = [1,2,3];
    
    //some code
    
      $('#add-location').click(function () {
        $.ajax({
          type: "POST",
          url: "${g.createLink(controller:'myController', action: 'myControllerMethod')}",
          data: {items: items},
          success: function (data) {
            console.log(data)
          }
        });
      });
    </script>
    

    【讨论】:

    • 这看起来是个好主意,但是如何将选中的复选框收集到列表中?我将在每一行上使用复选框进行选择。
    • 使用 jQuery 可以获得所有选中元素的列表。看看这个文档:api.jquery.com/checked-selector
    • 检查我上面的修改。我需要详细的示例/说明如何做到这一点。它不仅收集检查的产品,还包括我如何将其传输到控制器。您已经提交了一个发送列表的脚本,但我该如何从这些复选框中创建列表。它不是表单中的复选框,而是列表中的复选框。
    • 在每次更新时将 javascript 项目转换为 json 存储(更新所有元素),然后最后更新同一页面上的隐藏字段,该字段将与其余数据一起传输到控制器解析 json 并迭代jQuery编译
    【解决方案2】:

    我会回答这个问题,但必须放慢速度,因为感觉就像我开始编写你的项目:

    在 gsp 中,您需要有一个隐藏字段,然后在您尝试捕获的数据中添加一个复选框,该复选框应包含构建输出所需的所有数据元素。

    <g:hiddenField name="userSelection" value=""/>
    
    <g:checkBox name="myCheckBox" id='myCheckBox' value="${instance.id}"
        data-field1="${instance.field1}" data-field1="${instance.field1}"
       checked="${instance.userSelected?.contains(instance.id)?true:false}" />
    

    在页面的 java 脚本段中,您需要添加以下内容

    这将自动选择选择并添加到 javascript 数组中

    // Customized collection of elements used by both selection and search form
    $.fn.serializeObject = function() {
        if ($("[name='myCheckBox']:checked").size()>0) {
            var data=[]
            $("[name='myCheckBox']:checked").each(function() {
                var field1=$(this).data('field1');
                var field2=$(this).data('field2');
                data.push({id: this.value, field1:field1, field2:field2 });
        });
                return data
        }
    };
    

    最重要的是,如果您需要破解分页,您的数据是否会位于许多不同的 gsp 列表页面中:

    //Modify pagination now to capture
    $(".pagination a").click(function() {
        var currentUrl=$(this).attr('href');
        var parsedUrl=$(this).attr('href', currentUrl.replace(/\&userSelection=.*&/, '&').replace(/\&userSelection=\&/, '&'));
        var newUrl=parsedUrl.attr('href') + '&userSelection=' + encodeURIComponent($('#userSelection').val());
        window.location.href=newUrl
        return false;
    });
    

    然后在控制器中解析 JSON 表单字段,并在发布时将其变为您想要的内容

    def u=[]
    def m=[:]
    if (params.userSelection) {
    def item=JSON.parse(params.userSelection)
    item?.each {JSONObject  i->
            // When field1 is null in JSON set it as null properly
            if (JSONObject.NULL.equals(i.field1)) {
                    i.field1=null
            }
    
            if (resultsGroup) {
                    if (!resultsGroup.contains(i.id as Long)) {
                            u << i
                    }
            } else {
                    u << i
            }
    }
    m.userSelected=item?.collect{it.id as Long}
    m.results=u
    }
    return m
    

    【讨论】:

    • 我理解你的感受,但我对 grovy 和 grails 没有特别深入的了解,这对我来说还有很长的路要走。即使我认为我在不使用任何 javascript 的情况下解决了我的问题。当我完成并测试所有部件后,我会带着解决方案回来。在此之前,非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 2013-10-25
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    相关资源
    最近更新 更多