jqGrid Filter Toolbar начальное значение по умолчанию - PullRequest
12 голосов
/ 14 марта 2010

Я использую jqGrid с панелью инструментов фильтра, мне нужно установить начальное значение фильтра по умолчанию для одного из полей, чтобы по умолчанию отображались только строки со статусом «Открыть», но при желании пользователь может отображать закрытые строки .

На данный момент у меня есть обходной путь, подобный этому

setTimeout(function() {$('#gs_Status').val('Open');$("#eventsGrid")[0].triggerToolbar()},500);

но это приводит ко второму запросу и на самом деле довольно плохо.

Кто-нибудь знает, как это сделать?

Редактировать : Еще немного исследований показывают, что это, вероятно, невозможно: (

Ответы [ 5 ]

38 голосов
/ 02 июля 2010

Для этого есть несколько шагов:

  1. передать значение по умолчанию в параметрах поиска модели столбца
  2. запретить процесс загрузки данных формы по умолчанию
  3. вызвать загрузку данных панели инструментов фильтра, когда таблица будет готова

Более подробно:

Установите тип данных сетки локальный (это предотвращает загрузку исходных данных) и установите значение по умолчанию для параметров поиска:

  $("#mytable").jqGrid({
    datatype: "local",
    colNames:['Keyword','Selected'], 
    colModel:[
     {name:'keyword',
      sortable:true,
      searchoptions: { defaultValue:'golf' }
    },
    {name:'selected',
      sortable:false,
      searchoptions: { }
    },
    ....
    ....

Затем добавьте панель инструментов фильтра, установите тип данных и URL и запустите загрузку:

  $('#mytable').jqGrid('filterToolbar', {autosearch: true});
  $('#mytable').setGridParam({datatype: 'json', url:'/get_data.php'});
  $('#mytable')[0].triggerToolbar();
3 голосов
/ 10 мая 2011

Все советы, которые я прочитал, не сработали для меня. Поэтому я много пробовал и провел некоторые исследования исходного кода jqGrid. Гораздо проще интегрировать функциональность «значение по умолчанию» или «сохраненные значения поиска», если вы используете событие beforeRequest.

Мне пришлось решить некоторые проблемы:

  1. Хотя это событие beforeRequest, заданные вами параметры поиска не будут использоваться, пока вы не вызовете triggerToolbar.
  2. triggerToolbar не только устанавливает новый запрос с новыми параметрами поиска, но также запускает перезагрузку данных таблицы - но предыдущий запрос все еще выполняется, поэтому вы делаете один и тот же запрос дважды (оба с новым поиском параметры).
  3. Установить значения по умолчанию, но позволить пользователю очистить / перезаписать их.
  4. Избегайте бесконечных циклов и сохраняйте старые функции поиска.

Вот код:

beforeRequest: function ()
{
    // Activate filter toolbar and define "beforeSearch" callback
    // to avoid a second search request on page load, triggered 
    // by "triggerToolbar()" when not set.
    //
    // Important: 
    // "beforeSearch" has to return true to avoid the second
    // request on page load, but it has to return false for all
    // following searches (otherwise it wouldn't be possible to
    // submit new searches by pressing Enter in search input fields).
    $("#myTable").jqGrid('filterToolbar', {
        beforeSearch: function(){
            if ($(this).data('firstSearchAbortedFlag') != '1')
            {
                $(this).data('firstSearchAbortedFlag', '1');
                return true;
            }

            // Return false or add your customizations here...
            return false;
        }
    });

    if ($(this).data('defaultValuesSetFlag') != '1')
    {
        // Set flag to set default only the first time when
        // the page is loaded.
        $(this).data('defaultValuesSetFlag', '1');

        // Set default values...
        // (id = 'gs_' + fieldname)
        $('#gs_field_a').val('value a');
        $('#gs_field_b').val('value b');

        // Call "triggerToolbar" to use the previously set
        // parameters for the current search.
        // 
        // Important: 
        // Set "beforeSearch" callback for "filterToolbar" to avoid
        // a second search request, triggered by "triggerToolbar".
        $("#myTable")[0].triggerToolbar();
    }
}

Надеюсь, это вам поможет!

1 голос
/ 06 марта 2012

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

При контакте с создателем jqGrid значение по умолчанию используется только для расширенного поиска.

Я написал функцию, которую вы можете установить в функции onBeforeRequest, которая будет захватывать все значения по умолчанию в параметрах поиска и добавлять их в данные публикации. Таким образом, значение по умолчанию будет добавлено в первоначальный запрос.

Чтобы убедиться, что вы все еще можете использовать событие onbeforeRequest, я изменяю onBeforeRequest в конце кода (this.p.beforeRequest = function () {}). Вы можете изменить это на то, что вы хотите, и назвать это. В следующий раз вы сделаете запрос, что функция будет использоваться, и эта функция будет закрыта (из-за переопределения).

function() {

    var defaultSearchOptions = [];
    var colModel = this.p.colModel;

    // loop trough each column and check if they have an default value in search options
    // and add them to the array
    $.each(colModel, function (index, column) {

        if (column.hasOwnProperty('searchoptions')) {

            var searchOptions = column.searchoptions;

            if (searchOptions.hasOwnProperty('defaultValue')) {

                defaultSearchOptions[defaultSearchOptions.length++] =
                {
                    ""field"": column.index,
                    ""op"": ""bw"",
                    ""data"": searchOptions.defaultValue
                };
            }
        }
    });


    // if there are any default search options retrieve the post data
    if (defaultSearchOptions.length > 0) {

        var postData = this.p.postData;

        var filters = {};

        // check if post data already has filters
        if (postData.hasOwnProperty('filters')) {
            filters = JSON.parse(postData.filters);
        }

        var rules = [];

        // check if filtes already has rules
        if (filters.hasOwnProperty('rules')) {
            rules = filters.rules;
        }

        // loop trough each default search option and add the search option if the filter rule doesnt exists
        $.each(defaultSearchOptions, function (defaultSearchOptionindex, defaultSearchOption) {

            var ruleExists = false;

            $.each(rules, function (index, rule) {

                if (defaultSearchOption.field == rule.field) {
                    ruleExists = true;
                    return;
                }
            });

            if (ruleExists == false) {
                rules.push(defaultSearchOption);
            }
        });

        filters.groupOp = 'AND';
        filters.rules = rules;

        // set search = true
        postData._search = true;
        postData.filters = JSON.stringify(filters);
    }

    this.p.beforeRequest = function() { // your before request function here };
    this.p.beforeRequest.call(this);
}

Надеюсь, это поможет

1 голос
/ 14 марта 2010

Вы смотрели Поиск на панели инструментов и Методы сетки дополнений в вики документации jqGrid?Похоже, что вы можете использовать filterToolbar для установки фильтра и triggerToolbar для установки фильтра.Я сам не пробовал, но вы, вероятно, могли бы сделать это в loadComplete после загрузки данных для сетки.

Помогает ли это?

0 голосов
/ 02 февраля 2017

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

Вот полный рабочий пример. Идея состоит в том, что существует фильтр столбцов с раскрывающимися списками статусов «Активный» и «Закрытый», где я хочу, чтобы по умолчанию был «Активный». Код имеет комментарии, чтобы объяснить, что происходит:

$('#deals').jqGrid({
    colNames: ['...','Status','...'],
    colModel: [
        { ... },
        // Use the defaultValue attribute to set your defaults in the searchOptions object
        { name: 'Status', stype: 'select', searchoptions: { defaultValue: 'Active', value: {"":"All","Active":"Active","Closed":"Closed",}, sopt: [ 'eq'] }, width: 60 },
        { ... }
    ],
    // Here's where we intercept each server request to cancel it if it's the first one. 
    // Returning false from this method causes the request to the server to be aborted.
    beforeRequest: function () {
        // Define a local reference to the grid
        var $requestGrid = $(this);
        // Check a data value for whether we've completed the setup. 
        // This should only resolve to true once, on the first run.
        if ($requestGrid.data('areFiltersDefaulted') !== true) {
            // Flip the status so this part never runs again
            $requestGrid.data('areFiltersDefaulted', true);
            // After a short timeout (after this function returns false!), now
            // you can trigger the search
            setTimeout(function () { $requestGrid[0].triggerToolbar(); }, 50);
            // Abort the first request
            return false;
        }
        // Subsequent runs are always allowed
        return true;
    },
    url: 'Url/to/your/action',
    datatype: 'json',
    mtype: 'POST',
    pager: '#deals-pager',
    rowNum: 15,
    sortname: 'Status',
    sortorder: 'desc',
    viewrecords: true,
    height: '100%'
}).jqGrid('filterToolbar', { stringResult: true });

Это также работает с библиотекой Lib.Web.Mvc (.NET), которая не поддерживает тип данных local.

Если у вас есть несколько сеток или вы хотите переместить логику beforeRequest в библиотеку для совместного использования, просто определите ее как отдельную функцию и укажите ее по имени в настройке сетки:

function jqGridFilterSetupRequestHandler = function () {
    var $requestGrid = $(this);
    if ($requestGrid.data('areFiltersDefaulted') !== true) {
        $requestGrid.data('areFiltersDefaulted', true);
        setTimeout(function () { $requestGrid[0].triggerToolbar(); }, 50);
        return false;
    }
    return true;
}

$('#deals').jqGrid({
    colNames: ['...','Status','...'],
    colModel: [
        { ... },
        // Use the defaultValue attribute to set your defaults in the searchOptions object
        { name: 'Status', stype: 'select', searchoptions: { defaultValue: 'Active', value: {"":"All","Active":"Active","Closed":"Closed",}, sopt: [ 'eq'] }, width: 60 },
        { ... }
    ],
    beforeRequest: jqGridFilterSetupRequestHandler,
    url: 'Url/to/your/action',
    datatype: 'json',
    mtype: 'POST',
    pager: '#deals-pager',
    rowNum: 15,
    sortname: 'Status',
    sortorder: 'desc',
    viewrecords: true,
    height: '100%'
}).jqGrid('filterToolbar', { stringResult: true });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...