jqGrid опция расширенного поиска 'beforeSearch'?

Я использую самый лучший плагин 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 не имеют правильного времени. Есть предложения о том, как действовать?

отметка


person driedger    schedule 22.03.2011    source источник
comment
Добро пожаловать в stackoverflow с очень хорошим первым вопросом. +1 от меня за вопрос. В ближайшее время я постараюсь описать возможный способ решения вашей проблемы. До потом ...   -  person Oleg    schedule 22.03.2011


Ответы (1)


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

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

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

В вашем случае вам нужно только изменить постданные перед отправкой и не нужно останавливать перезагрузку сетки. Таким образом, вы можете решить проблему, используя как минимум два стандартных события 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
         }
});
person Oleg    schedule 22.03.2011
comment
Спасибо за ваш ответ по этому поводу. Я многому научился из демонстрации, которую вы создаете для своих ответов, и я очень признателен. Я уверен, что смогу проработать и эту с вашими демонстрациями. Если ничего не помогает, хорошо знать, что в следующей версии будет добавлен метод решения этой проблемы. - person driedger; 23.03.2011
comment
есть ли способ выполнить цикл только по столбцу, в котором поиск верен? - person frabiacca; 21.03.2013
comment
@frabiacca: Извините, но я не понимаю, о чем вы. какой цикл вы имеете в виду? - person Oleg; 21.03.2013
comment
@oleg, если в моей модели ColModel объявлено 10 столбцов, но только 3 из них доступны для поиска (я имею в виду свойство search: true), можно ли создать цикл for для этих 3 столбцов? - person frabiacca; 21.03.2013
comment
Я задал этот вопрос, потому что postData.filters не определен в моей сетке :( - person frabiacca; 21.03.2013
comment
@frabiacca: Извините, но я не понимаю контекста вашего вопроса. Вы оставили комментарий к моему ответу, в котором нет цикла. Так что я все еще не понимаю твоей проблемы. postData.filters обычно заполняются jqGrid, а jqGrid позволяет устанавливать фильтры только для доступных для поиска полей. Поэтому я не понимаю, что вы имеете в виду, какой код вы используете и в какой ситуации (в каком контексте). - person Oleg; 21.03.2013