Я хочу сделать собственную функцию фильтрации для фильтров 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;
}
Заранее спасибо!
спасибо! Ваше решение более элегантно. Отлично .. :-) – Rimokas
Добро пожаловать, если это ответит на ваш вопрос .. вы можете проголосовать и сделать правильный ответ, спасибо :) – ghiscoding
Awesome .............. –