Grails GSP Loop through an index and do somthing with selected lines

本小妞迷上赌 提交于 2019-12-12 03:09:16

问题


In an Index-gsp, I want to be able to select an arbitrary number of lines and then by clicking a link send all those lines to a controller for processing e.g. creating new objects of a different kind.

I've no idea how selection can be done or how to collect these selected lines in a GSP. Maybe I should use a checkbox on each line if that's possible?

It's a list of products which is displayed using a modified index.gsp. Each product-line has a checkbox in front. What I want is to make a list of the products that are checked an then transmit this list to a controller.

a part of this 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>

So this not an ordinary form, just a list where I want to use a link to transmit it to the controller.

I'm a beginner and have no idea how to do it.


回答1:


You can collect all necessary data from page using javascript, and then send all data to your controller for processing. There are a lot of ways to do it. For example send via 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>



回答2:


I will answer this but have to slow down since it feels like i am beginning to write your project:

In gsp you will need to have a hidden field followed by a check box amongst data you are trying to capture, checkbox should contain all the data elements required to build your output.

<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}" />

In the java script segment of the page you will need to add the following

This will then auto select selection and add to javascript array

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

Most importantly will your data sit across many different gsp listing pages if so you will need to hack pagination:

//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;
});

Then in the controller parse the JSON form field and make it into what you want when posted

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


来源:https://stackoverflow.com/questions/42533148/grails-gsp-loop-through-an-index-and-do-somthing-with-selected-lines

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!