2013-02-22 27 views
7

Po uruchomieniu projektu MVC 4 w trybie Release jedna strona, która używa SlickGrid, nie wyświetla się poprawnie (siatka jest bardzo, bardzo wysoka i brakuje komórek siatki).Dlaczego Minimalny kod nie jest ekwiwalentem oryginału?

Jednak nie sądzę, że jest to kwestia SlickGrid, ale raczej sposób, w jaki program pakujący (System.Web.Optimization, który jest zintegrowany z MVC 4) zminimalizował kod.

Złapałem zminimalizowany JavaScript i zacząłem cofać minifikację w jednym obszarze, dopóki problem nie został rozwiązany. Uważam, że zmiana (i odpuść przewijanie, chcę opuścić wersję minified dokładnie jak jest)

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} 

do oryginalnego

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; 
} 

rozwiązuje problem, jeśli wszystkie inne elementy pliku minified pozostają niezmienione.

Funkcja jest stosowany następująco:

dataView.setFilter(SlickFilter); 

w celu zapewnienia funkcji połączenia zwrotnego przez SlickGrid odfiltrować pewnych wyników.

Jak to jest, że oryginalna i zminimalizowana funkcja nie są równoważne?

UPDATE

SlickGrid jest "kompilacji" funkcję filtrowania, że ​​świadczenia. Ten etap kompilacji nie udaje się z wersją minified. Skompilowany kod minified wygląda następująco:

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; 
} 

Uwaga Multiple powrotnej oświadczenia.

Z tego dodatkowego wglądu, udało mi się zidentyfikować odpowiednią SlickGrid błąd:

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

+0

Czy jesteś sam?Istnieje mnóstwo narzędzi do minifikacji, więc polecam Ci wypróbować inny. – lolol

+0

@lolol: Nie Używam 'System.Web.Optimization', który jest zintegrowany z MVC 4. Zaktualizowałem pytanie, aby to wyjaśnić. –

+0

Moja zła, nie mogę ci naprawdę pomóc. Przepraszam. (Mam podobne problemy, ale robiłem to sam, zmiana narzędzia rozwiązało problem). – lolol

Odpowiedz

4

Jedną różnicą jest to, że widzę item.option i args.searchString są oceniane, nawet jeśli pierwszy warunek jest prawdziwe, gdy nie byłyby w oryginalnym kodzie.

Czy próbowałeś wkroczyć do kodu, aby zobaczyć, jakie są wartości i jak na nich działa?

Oto niezmienny, zminimalizowany kod, aby zapisać każdego, kto robi to samo, lub jeśli chcesz go wypróbować i wkroczyć do niego.

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 (przez OP)

To dało mi na dobrej drodze, ale okazuje się, że SlickGrid jest "kompilacji" funkcję filtra. Znany jest problem, który kompilator czasami zawiedzie. W rzeczywistości kompilacja jest opcjonalna i nie jest konieczna w tym przypadku, ponieważ minifier już produkuje zoptymalizowany kod.

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

+0

Jestem z tobą - to jedyna różnica, jaką widzę. Ale ta różnica w ocenie tych dwóch elementów nie powinna mieć żadnego skutku - po prostu zwracają wartości, więc żaden kod w rzeczywistości nie działa inaczej. Nawet jeśli nie istnieją, po prostu wrócą niezdefiniowani, a kod będzie kontynuowany. Zwarcie '||' oznaczałoby, że wartości 'i' i' r' nigdy nie zostaną użyte, chyba że pierwsza linia nie występuje, co jest tym samym zachowaniem, co w przypadku, gdy były oddzielnymi instrukcjami "if". –

+0

Wygląda na to, że właściwy nawias poprawiłby to poprawnie ?, od powrotu do? – technosaurus

+0

W odniesieniu do rekordu ta sformatowana wersja wykazuje takie samo zachowanie, jak opublikowana wersja. Teraz debuguję, aby szukać efektów ubocznych w oparciu o Twoją sugestię. Dam ci znać! –