2015-02-19 3 views
0

У меня есть массив, из которого мне нужно отфильтровать JQGrid.Правила фильтра JqGrid - Можем ли мы фильтровать на основе массива?

var filter = ["a","b","c","d",...255]; 
var postData = $('jqGridName').jqGrid('getGridParam', 'postData'); 
jQuery.extend(postData, 
{ 
    filters: { 
     groupOp: "AND", 
     rules: [ 
      { field: "Types", op: "ne", data: filter[0] }, 
      { field: "Types", op: "ne", data: filter[1] }, 
      { field: "Types", op: "ne", data: filter[2] }, 
      { field: "Types", op: "ne", data: filter[3] }, 
      . 
      . 
      . 
      { field: "Types", op: "ne", data: filter[255] }, 
     ] 
    }, 
}); 

Количество элементов в массиве не определено. Но максимум он может содержать 255. . Нужно ли писать до 255 (как указано выше) или есть простой способ добиться того же?

С уважением,

Варуна R

+0

Вы можете использовать цикл для заполнения массива 'rules'. Если вам нужно отправить фильтр на сервер, вы можете использовать '' ni ''операцию (« не в ») вместо« ne »' («не равно»). Важно, чтобы сервер «понимал» операцию. – Oleg

+0

Я не отправляю его на сервер. Для параметра LoadOnce установлено значение true. Я фильтруюсь из загружаемых данных. –

+0

, если вы не отправляете данные на сервер, тогда опция 'loadonce: true' будет проигнорирована. Массив правил, который будет применяться * локально *, должен работать без каких-либо проблем с 255 элементами. У вас есть проблемы с производительностью?Сколько строк данных необходимо фильтровать? – Oleg

ответ

3

я должен постоянно думать о проблеме с пользовательской операции сортировки, которую я обещал вам (в комментарии) реализовать в будущей версии jqGrid от my fork. В конце я реализовал эту функцию. Я представляю его ниже.

The first demo использует Searching Toolbar и the second demo использует Advanced Searching. Оба используют общие настройки jqGrid, которые позволяют сделать пользовательскую операцию поиска по локальным данным.

Прежде всего, необходимо определить новый пользовательский поиск. Я использую в операции demo IN, которая позволяет определить одно правило с несколько значений. Я использую пользовательскую операцию в столбце «tax». Он позволяет фильтровать несколько значений, разделенных точкой с запятой (;). Соответствующий код выглядит, как показано ниже

$("#grid").jqGrid({ 
    colModel: [ 
     { name: "tax", label: "Tax", width: 100, template: "number", 
      //sopt contains CUSTOM operation "nIn" 
      searchoptions: { sopt: ["nIn", "eq", "ne", "lt", "le", "gt", "ge", "in", "ni"] } }, 
     ... 
    ], 
    customSortOperations: { 
     // the properties of customSortOperations defines new operations 
     // used in postData.filters.rules items as op peroperty 
     nIn: { 
      operand: "nIN",  // will be displayed in searching Toolbar for example 
      text: "numeric IN", // will be shown in Searching Dialog or operation menu in searching toolbar 
      title: "Type multiple values separated by semicolon (";") to search for one from the specified values", 
      buildQueryValue: function (otions) { 
       // the optional callback can be called if showQuery:true option of the searching is enabled 
       return otions.cmName + " " + otions.operand + " (" + otions.searchValue.split(";").join("; ") + ") "; 
      }, 
      funcName: "myCustomIn" // the callback function implements the compare operation 
     } 
    }, 
    myCustomIn: function (options) { 
     // The method will be called in case of filtering on the custom operation "nIn" 
     // All parameters of the callback are properties of the only options parameter. 
     // It has the following properties: 
     //  item  - the item of data (exacly like in mydata array) 
     //  cmName  - the name of the field by which need be filtered 
     //  searchValue - the filtered value typed in the input field of the searching toolbar 
     var fieldData = options.item[options.cmName], 
      data = $.map(
       options.searchValue.split(";"), 
       function (val) { 
        return parseFloat(val); 
       } 
      ); 
     return $.inArray(parseFloat(fieldData), data) >= 0; 
    } 
}); 

В результате операция "nIn" будет размещена в op свойства filters.rules таким же образом, как и в стандартной "en" операции, например. jqGrid отображает операцию как "nIN" на панели инструментов поиска (см. свойство valeu operand: "nIN"). Свойство tooltip определяет всплывающую подсказку, отображаемую над операцией.

enter image description here

и можно отфильтровать результаты, как на анимированного GIF ниже

enter image description here

Во время фильтрации вызовов jqGrid myCustomIn обратного вызова. Так что абсолютно бесплатно, как реализовать соответствующую операцию.

Таким же образом можно использовать расширенный поиск слишком:

enter image description here

ОБНОВЛЕНО:The wiki article описывает новую функцию более детально.

Смежные вопросы