Функция фильтра SlickGrid DataView работает ненормально - PullRequest
9 голосов
/ 03 февраля 2012

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

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

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

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

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

Ответы [ 2 ]

12 голосов
/ 03 февраля 2012

Потратив часы на то, чтобы почесать голову и обдумать то, что, как мне кажется, я знаю о том, как работают функции (обвиняя меня в недосыпании), я наконец-то подумал о проверке кода 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;
}
6 голосов
/ 06 февраля 2012

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

...