2013-05-25 2 views
0

Я хочу сделать собственную функцию фильтрации для фильтров SlickGrid, которые обычно будут унифицированы и могут использоваться в 99%. Что я пропустил в Slickgrid - какой тип данных используется в столбце? Может быть, это alreday существует, но после просмотра источников я не нашел. Если это существует, я буду благодарен, если вы направите меня к истинному пути. Тип Slick.Editors? Но если столбец не предназначен для редактирования? ...
В образцах SlickGrid обычно используются фильтры, не допускающие тип данных, существуют только некоторые примеры с конкретным полем Id. Обычно данные - это символы, даты, булевы и числа. Для типов num я хочу улучшить фильтры с помощью <,> и других символов числовых операндов, то же самое можно сделать и с типами дат. В это время я могу это сделать только с идентификатором поля - я могу направить собственный глобальный массив с помощью fieldIds и типов, а затем распознать тип столбца. Но это решение не понятно - лучше это будет, если определить тип столбца из сетки.Тип столбца SlickGrid

Большое спасибо за любую помощь и идеи!

ДОБАВЛЕНО:

После некоторого поиска найдено, что я могу работать с данными SlickGrid значения типов. Я новичок с Javascript, поэтому любая помощь и предложения по улучшению источника ниже приветствуются ... :-)

Вот мой источник:

function filter(item) 
    { 
    for (var columnId in colFilt) 
    { 
     if (columnId !== undefined && colFilt[ columnId ] !== "") 
     { 
      var c = grid.getColumns()[ grid.getColumnIndex(columnId) ]; 
      var typ = varType(item[ c.field ]); 
      if (typ == "N" || typ == "D") 
      { 
       var arr = date_num_filter(colFilt[ columnId ]) 
       if (arr.length > 0) 
       { 
       if (arr.length == 2) 
       { 
        switch (arr[ 0 ]) 
        { 
         case "<" : 
          if (item[ c.field ] >= arr[ 1 ]) 
           return false; 
          break; 
         case ">" : 
          if (item[ c.field ] <= arr[ 1 ]) 
          return false; 
          break; 
         case "<=" : 
          if (item[ c.field ] > arr[ 1 ]) 
          return false; 
          break; 
         case ">=" : 
          if (item[ c.field ] < arr[ 1 ]) 
          return false; 
          break; 
         default : 
          return false;       
        } 
       } 
       else 
       { 
        if (item[ c.field ] < arr[ 1 ] || item[ c.field ] > arr[ 3 ]) 
         return false; 
       } 
       } 
       else 
       { 
       if (item[ c.field ] != colFilt[ columnId ]) 
        return false; 
       }  
      } 
      if (typ == "C") // item[ c.field ].substring 
      { 
       if (item[ c.field ].toLowerCase().indexOf(colFilt[ columnId ]) == -1) // item[ c.field ] != colFilt[ columnId ] && 
       return false; 
      } 
     } 
    } 
    return true; 
    } 

    function varType(o) 
    { 
    if (o.toFixed) 
     return "N"; 
    if (o.substring) 
     return "C"; 
    if (o.getMonth) 
     return "D"; 
    if (o == true || o == false) 
     return "L"; 
    return "U"; 
    } 

    function date_num_filter(cVal) 
    { 
    var ret_arr = []; 
    var p  = -1; 
    var n1,n2,n3 

    if (cVal.length == 0) 
     return ret_arr; 

    n1 = cVal.indexOf(".."); 
    n2 = cVal.indexOf("<"); 
    n3 = cVal.indexOf(">"); 
    if (n1 >= 0 || n2 >= 0 || n3 >= 0) 
    { 
     p = cVal.indexOf(".."); 
     if (p >= 0 && cVal.length > 2) 
     { 
      if (p == 0 || p == cVal.length - 2) 
      { 
       ret_arr[ 0 ] = (p == 0 ? "<=" : ">="); 
       ret_arr[ 1 ] = (p == 0 ? cVal.substr(2) : cVal.substr(0, p)); 
      } 
      else 
      { 
       ret_arr[ 0 ] = ">="; 
       ret_arr[ 1 ] = cVal.substr(0, p); 
       ret_arr[ 2 ] = "<="; 
       ret_arr[ 3 ] = cVal.substr(p + 2); 
      }     
      return ret_arr; 
     } 

     n1 = cVal.indexOf("<="); 
     n2 = cVal.indexOf(">="); 
     if (n1 == 0 || n2 == 0) 
     { 
      if (cVal.length > 2); 
      { 
       ret_arr[ 0 ] = cVal.substr(0, 2); 
       ret_arr[ 1 ] = cVal.substr(2); 
       return ret_arr; 
      } 
     } 
     n1 = cVal.indexOf("<"); 
     n2 = cVal.indexOf(">"); 
     if (n1 == 0 || n2 == 0) 
     { 
      if (cVal.length > 1); 
      { 
       ret_arr[ 0 ] = cVal.substr(0, 1); 
       ret_arr[ 1 ] = cVal.substr(1); 
       return ret_arr; 
      } 
     } 
    } 
    return ret_arr; 
    } 

Заранее спасибо!

ответ

4

Ваш английский немного трудно понять, но я считаю, что вы пытаетесь сделать фильтрацию, используя некоторые условия, подобные этому (> 100,! = 100, <> 100), и я сделал это под своим проектом с 2 функциями , Принцип заключается в том, что он начнется с проверки первого символа и если найдет любой из этих 4 символов (<,>,!, =), То мы знаем, что это условный фильтр, после чего он будет захватить это условие до тех пор, пока не будет найдено пробел вы поймаете любые символы с 1 или 2 символами (<, < =, <>,! = и т. д.). Кроме того, условие проверяет, является ли это первым, потому что выполнение> 1 в строке и на номере имеет 2 разных результата.

Вот мои 2 функции:

function myFilter(item) { 
    // Regex pattern to validate numbers 
    var patRegex_no = /^[$]?[-+]?[0-9.,]*[$%]?$/; // a number negative/positive with decimals with/without $, % 

    for (var columnId in columnFilters) { 
     if (columnId !== undefined && columnFilters[columnId] !== "") { 
      var c = grid.getColumns()[grid.getColumnIndex(columnId)]; 
      var filterVal = columnFilters[columnId].toLowerCase(); 
      var filterChar1 = filterVal.substring(0, 1); // grab the 1st Char of the filter field, so we could detect if it's a condition or not 

      if(item[c.field] == null) 
       return false; 

      // First let see if the user supplied a condition (<, <=, >, >=, !=, <>, =, ==) 
      // Substring on the 1st Char is enough to find out if it's a condition or not 
      // if a condition is supplied, we might have to transform the values (row values & filter value) before comparing 
      // for a String (we'll do a regular indexOf), for a number (parse to float then compare), for a date (create a Date Object then compare) 
      if(filterChar1 == '<' || filterChar1 == '>' || filterChar1 == '!' || filterChar1 == '=') { 
       // We found a Condition filter, find the white space index position of the condition substring (should be index 1 or 2) 
       var idxFilterSpace = filterVal.indexOf(" "); 

       if(idxFilterSpace > 0) { 
        // Split the condition & value of the full filter String 
        var condition = filterVal.substring(0, idxFilterSpace); 
        filterNoCondVal = columnFilters[columnId].substring(idxFilterSpace+1); 

        // Which type are the row values? We'll convert to proper format before applying the condition 
        // Then apply the condition comparison: String (we'll do a regular indexOf), number (parse to float then compare) 
        if(patRegex_no.test(item[c.field])) {        
         if(testCondition(condition, parseFloat(item[c.field]), parseFloat(filterNoCondVal)) == false) 
          return false; 
        // whatever is remain will be tested as a regular String format  
        }else {        
         if (testCondition(condition, item[c.field].toLowerCase(), filterNoCondVal.toLowerCase()) == false) 
          return false; 
        } 
       } 
      }else{ 
       if (item[c.field].toLowerCase().indexOf(columnFilters[columnId].toLowerCase()) == -1) 
        return false; 
      } 
     } 
    } 
    return true; 
} 

/** Test a filter condition that is passed into String, since eval() function is a performance killer 
* I have created a switch case for all possible conditions. Performance is irrelevent this way 
* @var String condition: condition to filter with 
* @var any value1: 1st value to compare, the type could be anything (number, String or even Date) 
* @var any value2: 2nd value to compare, the type could be anything (number, String or even Date) 
* @return boolean: a boolean result of the tested condition (true/false) 
*/ 
function testCondition(condition, value1, value2){ 
    switch(condition) { 
     case '<': return (value1 < value2); 
     case '<=': return (value1 <= value2); 
     case '>': return (value1 > value2); 
     case '>=': return (value1 >= value2); 
     case '!=': 
     case '<>': return (value1 != value2); 
     case '=': 
     case '==': return (value1 == value2); 
    } 
    return resultCond; 
} 
+0

спасибо! Ваше решение более элегантно. Отлично .. :-) – Rimokas

+0

Добро пожаловать, если это ответит на ваш вопрос .. вы можете проголосовать и сделать правильный ответ, спасибо :) – ghiscoding

+0

Awesome .............. –

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