2012-02-03 6 views
9

Nella mia funzione di filtro personalizzato che ho impostato chiamando setFilter() sul mio DataView, ho fatto quanto segue per risolvere un problema con il mio algoritmo di filtraggio:SlickGrid funzione di filtro DataView comportarsi in modo anomalo

function myFilter(item) { 
    console.dir(item); 
    console.dir(arguments); 
} 

Con mia grande sorpresa, ho ricevuto il seguente output (pseudo-uscita):

  • oggetto - l'oggetto articolo reale
  • A rguments - un array di due elementi in cui il primo elemento è l'array di dataset (utilizzato da DataView) e il secondo argomento non è definito.

Come può essere questo (ad esempio arguments[0] !== item)?

+4

Chiedere e rispondere alla propria domanda come documentazione per aiutare potenzialmente altri utenti che potrebbero soffrire di un sintomo simile. Googling non ha prodotto risultati per me. Spero che lo faccia anche per gli altri ... –

risposta

12

Dopo aver passato ore a grattarmi la testa ea meditare su quello che pensavo di sapere su come funzionano le funzioni (incolpando la mia mancanza di sonno), ho finalmente pensato di controllare il codice SlickGrid. Ho scoperto il modo in cui SlickGrid ricompila la funzione di filtro (utilizzando toString() e il massaggio delle stringhe) per la memorizzazione nella cache/l'ottimizzazione e quindi l'effettivo array arguments non corrisponde alla firma del metodo originale.

Come un altro effetto collaterale, non è possibile utilizzare variabili non globali che sono legate alla chiusura della funzione di filtro.

Il metodo corretto per associare le variabili alla chiusura della funzione di filtro consiste nell'utilizzare il metodo setFilterArgs() di DataView. Il undefined ho visto come il secondo elemento dell'array arguments nella mia funzione di filtro (ricompilata) era in realtà uno slot per ricevere ciò che è passato attraverso setFilterArgs().

Aggiornamento

Ecco cosa SlickGrid fa per la funzione di filtro. Funzione di prova:

function (item) { 
    // my code here 
} 

versione Ricompilato (riformattato per migliorare la leggibilità):

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

L'ho capito anche io. Sebbene https://github.com/mleibman/SlickGrid/blob/master/examples/example-optimizing-dataview.html mi abbia indirizzato verso la giusta direzione – ragebiswas

6

FYI: ho fatto la funzione di filtro inlining opzionale e configurabile tramite "inlineFilters". L'impostazione è disattivata per impostazione predefinita.

+1

Super! E grazie per SlickGrid. È un fantastico pezzo di software. –

Problemi correlati