Почему уменьшенный код не эквивалентен оригиналу?
Когда я запускал свой проект MVC 4 в режиме выпуска, одна страница, которая использует SlickGrid , не отображалась правильно (сетка очень, очень высокая, и ячейки сетки отсутствуют).
Однако я не думаю, что это вопрос SlickGrid, а скорее о том, как bundler (System.Web.Optimization
, который интегрирован в MVC 4) минимизировал код.
Я схватил уменьшенный JavaScript и начал разворачивать минификацию в одной области за раз, пока проблема не была исправлена. Я нашел, что меняется (и прощаю прокрутка, я хочу оставить уменьшенную версию точно такой, как есть)
function SlickFilter(n,t){var i=n.option,r=t.searchString;return n.pctSortKey.key<t.percentCompleteThreshold||r!=""&&i.indexOf(r)==-1&&i!="Unweighted Response"&&i!="Median"&&i!="Average"?!1:!0}
К оригиналу
function SlickFilter(item, args) {
if (item.pctSortKey.key < args.percentCompleteThreshold) {
return false;
}
if (args.searchString != "" && item.option.indexOf(args.searchString) == -1 && item.option != "Unweighted Response" && item.option != "Median" && item.option != "Average") {
return false;
}
return true;
}
Решает проблему, если все остальные элементы уменьшенного файла остаются неизменными.
Функция используется следующим образом:
dataView.setFilter(SlickFilter);
Чтобы предоставить функцию обратного вызова для SlickGrid для фильтрации определенных результатов.
Как получается, что исходная и уменьшенная функции не эквивалентны?
Обновить
SlickGrid "компилирует" функцию фильтра это я вам обеспечу. Этот шаг компиляции завершается неудачей с уменьшенной версией. Скомпилированный мини-код выглядит следующим образом:
function anonymous(_items,_args) {
var _retval = [], _idx = 0; var n, t = _args; _coreloop: for (var _i = 0, _il = _items.length; _i < _il; _i++) { n = _items[_i];
//debugger;
var i = n.option,
r = t.searchString;
return
n.pctSortKey.key < t.percentCompleteThreshold
||
r !=""
&& i.indexOf(r)==-1
&& i != "Unweighted Response"
&& i != "Median"
&& i != "Average"
? !1
: !0
; } return _retval;
}
Обратите внимание на несколько операторовreturn .
С этим дополнительным пониманием я смог идентифицировать соответствующую ошибку SlickGrid:
1 ответ:
Единственное отличие, которое я вижу, - это этот пункт.вариант и Арги.строки поиска вычисляются даже тогда, когда первое условие истинно, когда их не было бы в исходном коде.
Вы пробовали войти в код, чтобы увидеть, что такое значения и как он действует на них?
Вот незамутненный мини-код, чтобы спасти любого другого, делающего то же самое, или если вы хотите попробовать его и войти в него.
function SlickFilter(n,t) { var i = n.option, r = t.searchString; return n.pctSortKey.key < t.percentCompleteThreshold || r !="" && i.indexOf(r)==-1 && i != "Unweighted Response" && i != "Median" && i != "Average" ? !1 : !0 }
EDIT (by OP)
Это вывело меня на правильный путь, но... оказывается, что SlickGrid "компилирует" функцию фильтра. Существует известная проблема, из-за которой компилятор иногда выходит из строя. Действительно, компиляция необязательна и не нужна в этом случае, так как минификатор уже производит оптимизированный код.