Grails,使用ajax

时间:2017-10-06 15:40:41

标签: sorting grails html-table

我有一个包含大量列的网格(html-table),并希望在此表上组合过滤和排序。 目前我只在一列上使用过滤,但在几列上排序。 我想用ajax做到这一点。 我读了一篇文章[http://www.craigburke.com/2011/01/23/grails-ajax-list-with-paging-sorting-and-filtering.html] 并尝试将其改编为我的grails-3.2.6版本。

这很难解决,现在我完全陷入困境。 如果我在过滤器中添加了一些内容,但没有任何反应,但是当我单击一列时,会发生过滤并进行排序,再次单击,不调用ajax,并使用默认值覆盖过滤器。我已经设法在一个行为相同的测试项目上实现它。 这是很多代码,也许有一种方法可以以某种方式将整个项目包含在这个问题中?

如果有帮助的话,我会尝试在这里展示大部分重要部分。

index.gsp:

<!DOCTYPE html>
<html>
<head>
    <meta name="layout" content="main" />
    <g:set var="entityName" value="${message(code: 'person.label', default: 'Person')}" />
    <title><g:message code="default.list.label" args="[entityName]" /></title>
    <script type="text/javascript">
        $(document).ready(function() {
            setupGridAjax();
            setupFilterAjax();
        });
    </script>

    <script type="text/javascript">            
        function setupGridAjax() {
            $('#gridPersons').find('.paginateButtons a, th.sortable a').on('click', function(event) {
                event.preventDefault();
                var url = $(this).attr('href');

                var grid = $(this).parents("table.ajax");
                $(grid).html($("#spinner").html());

                $.ajax({
                    type: 'GET',
                    url: url,
                    data: [tag],
                    success: function(data) {
                        $(grid).fadeOut('fast', function() {$(this).html(data).fadeIn('slow');});
                    }
                })
            });
        }
    </script> 
    <script type="text/javascript">            

    // Turn any input changes or form submission within a filter div into an ajax call
        function setupFilterAjax(){
            alert('FILTER--Anropat');
            $('div.filters select:input').on('change',function(event) {
                var filterBox = $(this).parents("div.filters");
                filterGrid(filterBox);
            });
            $("div.filters form").submit(function() {
                var filterBox = $(this).parents("div.filters");
                alert('FILTERBOX - '+filterBox);
                filterGrid(filterBox);
                return false;
            });
        }

    // Reload grid based on selections from the filter
        function filterGrid(filterBox) {
            alert('FILTER-change detected');
            var grid = $(filterBox).next("div.gridPersons");
            $(grid).html($("#spinner").html());

            var form = $(filterBox).find("form");
            var url = $(form).attr("action");
            var data = $(form).serialize();
                alert('FILTERGRID - '+url);
            $.ajax({
                type: 'POST',
                url: '${g.createLink( controller:'person', action:'index' )}',
                data: [tag],
                success: function(data) {
                $(grid).fadeOut('fast', function() {$(this).html(data).fadeIn('slow');});
            }
        });
    }

    </script> 
</head>
<body>
    <a href="#list-person" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content&hellip;"/></a>
    <div class="nav" role="navigation">
        <ul>
            <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>
        </ul>
    </div>
    <div id="list-person" 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>
        <div class="filters">
            <g:form action="register">
                <div id="selectMill">
                    Select tags:
                    <g:select class="selected" name="tag" from="${tagList}" value="${filters?.tag}" noSelection = "${['':'All']}" optionValue="" optionKey="" />
                </div>
                <div id="gridPersons">
                    <g:render template="Grid_Persons" model="personList" />
                </div>
                <div class="pagination">
                    <g:paginate total="${personCount ?: 0}" />
                </div>
                <fieldset class="buttons">
                    <input class="save" type="submit" value="${message(code: 'offer.create.from.buffer.label', default: 'Create')}" />
                </fieldset>
            </g:form>
        </div>
    </div>
</body>

模板:_Grid_Persons.gsp

<table class="ajax">
<thead>
    <tr>
        <g:sortableColumn property='reg' title='Register' />
        <g:sortableColumn property="id" title='Id' params="${filters}"/>
        <g:sortableColumn property='name' title='Name' params="${filters}"/>
        <g:sortableColumn property='tag' title='Tag' params="${filters}"/>
        <g:sortableColumn property='registered' title='Registered' params="${filters}"/>
</thead>
<tbody>
    <g:each in="${personList}" status="i" var="ps"> 
        <tr  class="${ (i % 2) == 0 ? 'even': 'odd'}">
            <td><g:checkBox name="ckb" value="${ps.id}" checked="false"  /></td>
            <td><g:link action="edit" id="${ps.id}">${ps.id}</g:link></td>
            <td>${ps.name}</td>
            <td>${ps.tag}</td>
            <td>${ps.registered}</td>
            <td>
    </g:each>
</tbody>

控制器的索引部分:

    def index(Integer max) {
    params.max = Math.min(max ?: 10, 100)

    def tagList = Person.withCriteria {
        projections {
            distinct("tag")
        }
    }

    def List<Person> personList = getPersonList()
    // Paging def prodBuffer = getPaginatedList(prodBuffer, max, params.offset?.toInteger())

    def filters = [tag: params.tag, sort: params.sort, order: params.order]

    def model = [personList: personList, filters:filters, tagList:tagList]

    if (request.xhr) {
        println("AJAX-Request!!!")
        render(template:"Grid_Persons", model:model)
        prodBuffer, offerDetails:offerDetails, filters:filters])
    } else {

        offerDetails: offerDetails, millList: millList, selectedMill:false, prodBufferCount: ProdBuffer.count()]
        [personList:personList,tagList:tagList]
    }

    Person.count(), tagList:tagList]
}

def List<Person> getPersonList() {
    println("getPersonList tag: "+params.tag)
    def tag = params.tag
    def c = Person.createCriteria()
    def tempList = c.list {
        if (tag) eq("tag", tag)
        if (params.sort){
            order(params.sort, params.order)
        }
    }
    return tempList
 }

来自调试:

页面已加载:

getPersonList tag:null

过滤器中选择的“Grails”:

getPersonList标签:Grails AJAX请求!!!

点击“名称” - 列标题

getPersonList标签:Grails AJAX请求!!!

- 现在列表已排序(升序)并已过滤

再次点击该列:

getPersonList标签:Grails

- 现在列表已经使用(降序)并且过滤仍然正常,但SELECT TAGS现在查看“全部”

第三次点击专栏:

getPersonList标签: AJAX请求!!!

- 现在列表显示所有行并使用(升序)

现在通过使用推荐的插件 - 数据表来解决。

1 个答案:

答案 0 :(得分:1)

如果您赶时间,可以注入https://datatables.net/,添加您需要的实用程序