Проверка перед отправкой формы поиска, созданной с использованием filterGrid в JQGrid - PullRequest
2 голосов
/ 02 ноября 2010

У меня есть поисковая форма, сгенерированная с помощью опции filterGrid в JqGrid. Я хочу добавить логику JavaScript, которая вызывается перед отправкой формы поиска. Я добавил метод, который вызывается свойством beforeSubmit для filterGrid. Он передается в метод перед отправкой, но всегда отправляет форму независимо от возвращаемого значения. Я хотел бы, чтобы форма не отправлялась, если javascript возвращает false.

Кто-нибудь из вас, ребята, реализовывал что-то подобное раньше? Или есть какой-нибудь более лучший способ реализовать это. Любая помощь в этом будет очень признательна.

Код:

$("#search").filterGrid("#resultsGrid",
                        {gridModel:true,gridNames:true,enableSearch:true,
                         formtype:"vertical",buttonclass:"submitButton",
                         enableClear:true,beforeSearch:validateDate});

function validateDate(dateDiff) {
    if(daysDiff < 0){
        return [false,"Message"];
    }
    } // ??? (commented by Oleg)
    return [true,""];
}

1 Ответ

2 голосов
/ 02 ноября 2010

Существует как минимум три способа использования поиска: Поиск по панели инструментов , Выборочный поиск , который вы используете, и Поиск по одному полю или Расширенный поиск с одинаковым кодом.Таким образом, в настоящее время имеется три различных реализации близких вещей.

Только Поиск по панели инструментов имеет обработчик beforeSearch, который может возвращать false, чтобы остановить поиск.В случае Пользовательский поиск значение, возвращаемое обработчиком события beforeSearch , не будет использоваться . Поиск по одному полю или Расширенный поиск не вызывать обработчик событий перед поиском.Во всех случаях для поиска установите поисковый фильтр и параметр jqGrid search в true, а затем принудительно перезагрузите сетку с кодом, подобным

$("#gridId").trigger("reloadGrid",[{page:1}]);

, чтобы иметь возможность выполнить любые проверки и остановить перезагрузкуСетка не вижу простого пути.Поэтому я предлагаю только следующее.

Вы можете переписать стандартный reloadGrid обработчик событий и chain it.Соответствующий код выглядит следующим образом:

var grid = $("#gridId");
var events = grid.data("events"); // read all events bound to 
var originalReloadGrid; // here we will save the original event handle
var skipRefresh = false; // this can be changed by owe validation function
// Verify that one reloadGrid event hanler is set. It is typical sitation
if (events && events.reloadGrid && events.reloadGrid.length === 1) {
    originalReloadGrid = events.reloadGrid[0].handler; // save old
    grid.unbind('reloadGrid');
    var newEvents = grid.data("events");
    grid.bind('reloadGrid', function(e,opts) {
        if (!skipRefresh && grid[0].p.search) {
            originalReloadGrid(e,opts);
        }
    });
}

Возможно, позже я создам демо-версию, демонстрирующую это на примере, и разместу здесь ссылку на демоверсию.Более того, я постараюсь предложить изменения кода в jqGrid так, чтобы во всех различных реализациях поиска было возможно остановить поиск, возвращая false по beforeSearch дескриптору события.

UPDATED : ХОРОШО!Я подготовил демо для вас.В демоверсии я не использую серверные компоненты, поэтому он не будет выполнять поиск, но вы можете увидеть результаты, если сетка будет обновлена ​​и перейдет на страницу 1.

Для проверки демо Вы можете сделать следующее:

  1. введите в поле ввода «Клиент» текст, не начинающийся с «тест», и нажмите кнопку «Поиск».Вы получите предупреждение, имитирующее диалог проверки.
  2. введите в поле ввода «Клиент» текст, начинающийся с «test», например test1, и нажмите кнопку «Поиск».Теперь григ будет обновлен, потому что проверка будет в порядке.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...