Я использую loadonce, чтобы получить все данные заранее, а затем выполняю сортировку и фильтрацию локально.
Одним из значений моего столбца является массив объектов.В опции colModel я использую функцию форматирования, которая выглядит следующим образом:
function my_formatter(cellValue)
{
return $.map(cellValue, function(element) {return element.human_readable_name;}).join(', ');
}
Я также использую пользовательскую функцию сортировки, которая просто возвращает длину массива.
У меня проблема в том, чточто фильтрация панели инструментов и многополевая диалоговая фильтрация не работают.Похоже, они ищут в [objects] .toString (), а не в отформатированном значении.Таким образом, я получаю хиты, когда я ищу "[объект объекта]", но не когда я ищу фактические значения.
Есть ли способ заставить локальную фильтрацию использовать отформатированное значение?
Редактирование на основе ответа Олега:
Я адаптировал код Олега для добавления форматирования фильтра по столбцам.Вроде хорошо работает.Я удалил замену _toStr, потому что она не показалась необходимой - я думаю, что она используется для изменения поискового термина (что имеет смысл в случае с ударением в акценте Олега, но не в моем).
// Causes local filtering to use custom formatters for specific columns.
// formatters is a dictionary of the form:
// { "column_name_1_needing_formatting": "column1FormattingFunctionName",
// "column_name_2_needing_formatting": "column2FormattingFunctionName" }
// Note that subsequent calls will *replace* all formatters set by previous calls.
function setFilterFormatters(formatters)
{
function columnUsesCustomFormatter(column_name)
{
for (var col in formatters)
{
if (col == column_name)
return true;
}
return false;
}
var accessor_regex = /jQuery\.jgrid\.getAccessor\(this\,'(.+)'\)/;
var oldFrom = $.jgrid.from;
$.jgrid.from = function(source, initialQuery) {
var result = oldFrom(source, initialQuery);
result._getStr = function(s) {
var column_formatter = 'String';
var column_match = s.match(accessor_regex, '$1');
if (column_match && columnUsesCustomFormatter(column_match[1]))
{
column_formatter = formatters[column_match[1]];
}
var phrase=[];
if(this._trim) {
phrase.push("jQuery.trim(");
}
phrase.push(column_formatter+"("+s+")");
if(this._trim) {
phrase.push(")");
}
if(!this._usecase) {
phrase.push(".toLowerCase()");
}
return phrase.join("");
}
return result;
};
}
Ион вызывается так:
setFilterFormatters({'column_with_array_of_objects':'my_formatter'});
Тестирование предполагает, что это работает для «содержит», «не содержит», «равно», «не равно» (и, вероятно, «начинается с» и другихпростые сравнения строк - но я ими не пользуюсь).
Спасибо, Олег.