Почему уменьшенный код не эквивалентен оригиналу?


Когда я запускал свой проект 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:

Https://github.com/mleibman/SlickGrid/issues/301

1 7

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 "компилирует" функцию фильтра. Существует известная проблема, из-за которой компилятор иногда выходит из строя. Действительно, компиляция необязательна и не нужна в этом случае, так как минификатор уже производит оптимизированный код.

Https://github.com/mleibman/SlickGrid/issues/301