опция расширенного поиска jqGrid 'beforeSearch'? - PullRequest
5 голосов
/ 22 марта 2011

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

Я использую filterToolbar, чтобы выполнить поиск по моей сетке.Из-за особенностей серверной части, с которой мне нужно взаимодействовать, я не могу использовать фильтры, которые предоставляет jqGrid, и вместо этого мне нужно перехватить поиск и изменить постданные перед отправкой.Я делаю это с помощью опции filterToolbar "beforeSearch", например так:

$("#SC_grid").jqGrid('filterToolbar', {stringResult: true, searchOnEnter: true, defaultSearch : "cn", beforeSearch: function() {
            var postData = $("#SC_grid").jqGrid('getGridParam','postData');
            var newPostData = '1=1';
            var searchData = jQuery.parseJSON(postData.filters);
            for (var iRule=0; iRule<searchData.rules.length; iRule++) {
                newPostData = newPostData + " AND " + searchData.rules[iRule].field + " LIKE '%" + searchData.rules[iRule].data + "%' ";
            }
            $("#SC_grid").jqGrid('setGridParam',{postData: { filter: newPostData, filters: ''} } );
            return false;
}});

Это прекрасно работает для меня, чтобы создать часть моего выбора перед отправкой.Я также хотел бы использовать расширенный поиск таким же образом, но не могу понять, как перехватить POST перед отправкой.Похоже, что параметр beforeSearch () недоступен, а параметры afterShowSearch или onClose не имеют правильного времени.Любые предложения о том, как поступить?

Отметка

1 Ответ

4 голосов
/ 23 марта 2011

Вы правы, в текущей реализации расширенного поиска jqGrid нет таких событий, как beforeSearch. Новая версия расширенного поиска, которая полностью написана, будет иметь метод onSearch, который вы могли бы использовать. Метод типа beforeSearch будет запущен до trigger("reloadGrid",[{page:1}]), но после заполнения postData.

beforeSearch из filterToolbar имеет еще одну интересную особенность, поэтому вы можете остановить поиск, вернув значение true из beforeSearch. Таким образом, beforeSearch может играть роль проверки.

В одном моем старом ответе я описал универсальный метод, который можно использовать для любого вида проверки или postData модификации. В ответ я покажу, как можно создать подкласс обработчика событий reloadGrid в jqGrid и остановить перезагрузку сетки, если это необходимо. Демо показывает это. Таким же образом здесь можно сделать любую другую модификацию данных. Жаль, но ответ будет очень плохо проиндексирован и не будет увлечен поиском в стеке потока. Так что никто этого не знает.

В вашем случае вам нужно только , чтобы изменить постданные перед отправкой и не нужно останавливать перезагрузку сетки. Таким образом, вы можете решить эту проблему, используя как минимум два стандартных события jqGrid: beforeRequest и serializeGridData . В обоих случаях вы можете получить доступ к параметрам search (как this.p.search) и postData (как this.p.postData). Значение параметра search будет отправлено на сервер как _search и будет установлено на true, если используется какой-либо из методов поиска / фильтрации. Так что внутри одного из обработчиков событий вы можете изменить this.p.postData.

Внутри serializeGridData у вас есть даже способ определить, какие именно данные будут отправляться на сервер без необходимости их изменения. Преимущество состоит в том, что если вы откроете диалоговое окно расширенного поиска в следующий раз, вы увидите (и сможете изменить, если необходимо) последний поисковый запрос.

Если вам нужна одинаковая реализация beforeRequest или serializeGridData на многих сетках вашего веб-сайта, вы можете установить реализацию функции по умолчанию для $.jgrid.defaults:

$.extend($.jgrid.defaults, {
         datatype: 'json', // overwrite default value of any jqGrid parameter
         serializeGridData: function(postData) {
             // your implementation
         }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...