Подтвердить что ты не робот

Начальное значение по умолчанию для панели инструментов jqGrid

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

В настоящий момент у меня есть обходной путь

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

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

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

Изменить. Немного больше исследований говорит мне, что это, вероятно, невозможно: (

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Немного подробнее:

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

  $("#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

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

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

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

Здесь код:

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();
    }
}

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

Ответ 4

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

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

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

Чтобы вы все еще могли использовать событие 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);
}

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

Ответ 5

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

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

$('#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 where we intercept each server request to cancel it if it 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 });