Функция фильтра SlickGrid DataView работает ненормально

В моей пользовательской функции фильтра, которую я установил, вызвав setFilter() на моем DataViewЯ сделал следующее, чтобы устранить проблему с моим алгоритмом фильтрации:

function myFilter(item) {
    console.dir(item);
    console.dir(arguments);
}

К моему удивлению, я получил следующий вывод (псевдо-вывод):

  • Объект - фактический объект предмета
  • Аргументы - массив из двух элементов, где первый элемент - это массив набора данных (который использует DataView), а второй аргумент не определен.

Как это можно (т.е. arguments[0] !== item) быть?

2 ответа

Решение

Потратив часы на то, чтобы почесать голову и обдумать то, что, как мне показалось, я знаю о том, как работают функции (обвиняя меня в нехватке сна), я, наконец, подумал о проверке кода SlickGrid. Я обнаружил трудный способ, которым SlickGrid перекомпилирует функцию фильтрации (используя toString() и массива строк) для кэширования / оптимизации и, следовательно, фактического arguments массив не соответствует исходной сигнатуре метода.

В качестве другого побочного эффекта вы не можете использовать неглобальные переменные, которые связаны с закрытием функции фильтрации.

Правильный способ привязать переменные к закрытию функции фильтрации - это использовать setFilterArgs() метод DataView. undefined Я видел в качестве второго пункта arguments массив в моей (перекомпилированной) функции фильтрации был фактически слотом для получения того, что было передано setFilterArgs(),

Обновить

Вот что SlickGrid делает с функцией фильтра. Тестовая функция:

function (item) {
    // my code here
}

Перекомпилированная версия (переформатирована для удобства чтения):

function (_items, _args) {
    var _retval = [], _idx = 0;
    var item, undefined = _args;

    for (var _i = 0, _il = _items.length; _i < _il; _i++) {
        item = _items[_i];

        // my code here
    }

    return _retval;
}

К вашему сведению: я сделал функцию встроенного фильтра необязательной и настраиваемой через "inlineFilters". Настройка отключена по умолчанию.

Другие вопросы по тегам