free-jqGrid (4.15.4), фильтр сервера, сортировка клиентов и подкачка страниц? - PullRequest
0 голосов
/ 28 января 2019

Попытка загрузить данные с сервера на основе многопользовательского поиска / фильтров, но выполнить сортировку и разбиение на страницы на клиенте.Я нашел несколько сообщений, в которых говорится, что просто установить тип данных обратно к исходному значению в методе beforeSearch.

Я попытался это, и он действительно выполняется на сервере и возвращает правильные данные.Тем не менее, во второй раз, когда я фильтрую, кажется, что данные поступают с сервера, но затем они стираются в строке 4429 в коде jqgrid, показанном ниже.Любая идея о том, как достичь этой цели?

Ln 4429: p.lastSelectedData = query.select ();

определение сетки:

$element
    .jqGrid({
        cmTemplate: { search: true, searchoptions: { attr: { placeholder: "filter..." }, clearSearch: true }, sortable: true, align: "center" },
        colModel: [
            { name: "Id", key: true, hidden: true, searchoptions: { searchhidden: true, sopt: ["eq"] } },
            { name: "TransmissionId", label: "Transmission Id", searchoptions: { sopt: ["eq"] } },
            { name: "Name", label: "Name", searchoptions: { sopt: ["cn"] } }
        ],
        datatype: "json",
        loadonce: true,
        height: "auto",
        ignoreCase: true,
        pager: $("#" + pagerId),
        pgbuttons: true,
        pginput: false,
        rowList: [10, 25, 50],
        rowNum: 10,
        toppager: true,
        url: "url here",
        loadComplete: function (data) {
            if (this.p.datatype === "json") {
                setTimeout(function () {
                    $element.trigger("reloadGrid", [{ page: 1 }]);
                }, 50);
            }
            return data;
        },
        viewrecords: true
    })
    .jqGrid("filterToolbar", {
        autosearch: true,
        defaultSearch: "cn",
        beforeSearch: function () {
            $element.setGridParam({ datatype: "json", page: 1 });
        }
    })
    .jqGrid("navGrid", "#" + pagerId, {
        edit: false,
        add: false,
        del: false,
        refresh: false,
        view: false,
        cloneToTop: true
    });

Я обрезал сетку, чтобы убедиться, что это не пользовательская логика, которая вызывает эту проблему.сетка имеет multipleSearch вкл.но не определено выше.

1 Ответ

0 голосов
/ 28 января 2019

Если я правильно понимаю ваш вопрос, тогда вам следует использовать forceClientSorting: true в сочетании с loadonce: true.Это означает, что данные, загруженные с сервера, будут отсортированы, отфильтрованы и разбиты на страницы локально непосредственно после загрузки с сервера.Таким образом вы можете удалить loadComplete, который вы используете в настоящее время.См. ответ для демонстрации.

Кроме того, вы можете добавить свойство searching, в которое включены все параметры filterToolbar и searchGrid:

searching: {
    autosearch: true,
    defaultSearch: "cn",
    beforeSearch: function () {
        var p = $(this).jqGrid("getGridParam"), // get reference to all parameters
            filters = JSON.parse(p.postData.filters);
        p.datatype = "json";
        // one can here analyse filters, modify it or clear it as
        p.postData.filters = "";
        // one can set any other parameters, which will be sent to the server
        // by using p.postData.param1 = "value1";
        // which will sent param1=value1 to the server.
    }
}

Как правило, вы можете сделать то же самое и в своем текущем beforeSearch.

ОБНОВЛЕНО: Возможно, вам следует дополнительно использовать beforeProcessing обратный вызов.beforeProcessing будет вызываться сразу после получения данных с сервера.Внутри обратного вызова вы можете очистить все p.postData.filters (до "") и p.search (измените его с true на false).В результате jqGrid не попытается отфильтровать локально по postData.filters данных, полученных с сервера.

...