Функция фильтра 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". Настройка отключена по умолчанию.