2013-02-22 12 views
7

Quando ho eseguito il progetto MVC 4 in modalità di rilascio, una pagina che utilizza SlickGrid non è stata visualizzata correttamente (la griglia è molto, molto alta e mancano le celle della griglia).Perché il codice miniato non è equivalente all'originale?

Tuttavia, non credo che questo è un problema di SlickGrid, ma piuttosto di come il Bundler (System.Web.Optimization che è integrato nel MVC 4) ridotte di codice.

Ho afferrato il codice JavaScript minisito e ho iniziato a invertire la minificazione in un'area alla volta fino a quando il problema non veniva risolto. Ho trovato che il cambiamento (e perdonare lo scorrimento, voglio lasciare la versione minified esattamente così com'è)

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} 

all'originale

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

risolve il problema se tutti gli altri elementi del file minified sono invariati

La funzione viene utilizzata come:

dataView.setFilter(SlickFilter); 

per fornire una funzione di callback per SlickGrid per filtrare determinati risultati.

Come è possibile che la funzione originale e quella minificata non siano equivalenti?

UPDATE

SlickGrid è "Compilazione" la funzione di filtro che fornisco. Quella fase di compilazione ha esito negativo con la versione minificata. Il codice compilato minified assomiglia:

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

Nota multiplo ritorno dichiarazioni.

Con questa intuizione aggiuntivo, sono stato in grado di identificare un rilevante errore SlickGrid:

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

+0

Stai minifando il js da solo?Ci sono tonnellate di strumenti minificatori là fuori, quindi ti consiglio di provarne un altro. – lolol

+0

@lolol: No sto usando 'System.Web.Optimization' che è integrato in MVC 4. Aggiornato la domanda per chiarire che. –

+0

Il mio male, non posso davvero aiutarti allora. Scusate. (Ho avuto problemi simili, ma lo stavo facendo da solo, cambiando lo strumento ho risolto il problema) – lolol

risposta

4

L'unica differenza che vedo è che item.option e args.searchString sono in corso di valutazione anche quando la prima condizione è vero quando non sarebbero stati nel codice originale.

Hai provato a entrare nel codice per vedere quali sono i valori e come agisce su di essi?

Questo è il codice minorato non modificato per salvare chiunque altro faccia lo stesso, o se si desidera provarlo e intervenire.

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

Questo mi ha fatto sulla strada giusta, ma si scopre che è SlickGrid "Compilazione" la funzione di filtro. C'è un problema noto che il compilatore a volte fallisce. Infatti la compilazione è facoltativa e non necessaria in questo caso poiché il minificatore produce già codice ottimizzato.

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

+0

Sono con te - questa è l'unica differenza che vedo. Ma questa differenza di valutazione di questi due elementi non dovrebbe avere alcun effetto - stanno solo restituendo valori, quindi nessun codice è in realtà in esecuzione in modo diverso. Anche se non esistessero, tornerebbero indefiniti e il codice continuerebbe. Il cortocircuito '||' significherebbe che i valori di 'i' e' r' non saranno mai usati a meno che la prima riga non si verifichi, il che è lo stesso comportamento di quando erano dichiarazioni 'if' separate. –

+0

Sembra che una parentesi corretta lo risolva correttamente ?, dal ritorno a? – technosaurus

+0

Per la cronaca, questa versione formattata presenta lo stesso comportamento della versione che ho postato. Ora sto eseguendo il debug per cercare gli effetti collaterali in base al tuo suggerimento. Ti farò sapere! –