будет вызываться с именем столбца. Таким образом, каждый может реализовать все, что вам нужно, но вы должны внести больше изменений в моей демонстрации.

ользую 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'});

Тестирование показывает, что это работает для «содержит», «не содержит», «равно», «не равно» (и, вероятно, «начинается с» и других простых сравнений строк - но я их не использую).

Спасибо, Олег.

Ответы на вопрос(1)

Ваш ответ на вопрос