2014-09-24 11 views
5

Dato un SlickGrid, come posso attivare tutte le celle in tutte le righe da convalidare? O forse usare JavaScript per innescare una volta che la cella è stata convalidata (che posso quindi usare contro tutte le celle in tutte le righe)?Convalida tutte le celle in tutte le righe di SlickGrid

Il caso d'uso è quella in cui l'utente deve modificare ogni cellula e fornire qualcosa di diverso da quello predefinito, e vogliamo per assicurarsi che essi hanno fatto e vogliamo mostrare il comportamento errore di validazione di default se non l'hanno .

Attualmente sembra che la convalida avvenga solo sui campi che vengono modificati.

+0

Si sta utilizzando tutte le altre strutture che si potrebbe delegare questa parte del "lavoro" per? Come è stato osservato, la convalida predefinita di Slickgrid è limitata solo alla funzione 'validate' di un' editor' che viene passato solo come parametro. È possibile modificare l'origine per ottenere il comportamento desiderato, ma personalmente delegherò questo tipo di convalida a un altro framework (ad es. [Knockout Validation] (https://github.com/Knockout-Contrib/Knockout-Validation)) ... anche se sono parziale a questa combinazione come ho esperienza con esso. – Origineil

+0

No, preferirei mantenere la convalida SlickGrid integrata. – jlarson

+0

Ho [avviato una demo] (http://jsfiddle.net/origineil/nLpzjL32/) di validazione della rete completa. Il pulsante 'validate' eseguirà qualsiasi colonna definita' validator' rispetto a ciascuna voce di dati. * Il comportamento di errore di convalida predefinito * è quello di non consentire la chiusura di un campo di input dell'editor, quindi ho aggiunto il lampeggio della cella per illustrare dove è necessario implementare la gestione degli errori desiderata. In secondo luogo, non so quale sia un valore * predefinito *, quindi ho usato solo numeri con il requisito che siano '> 0'. – Origineil

risposta

2

Come osservato, la convalida predefinita di Slickgrid è limitata alla funzione validate di un editor che verifica la disponibilità di validator disponibile solo come valore del parametro. Per fornire ulteriori informazioni contestuali, è richiesto un editor personalizzato o, più specificamente, una funzione di convalida personalizzata.

this.validate = function() { 
    if (args.column.validator) { 
     args.newValue = $input.val() 
     var validationResults = args.column.validator(args); 

     if (!validationResults.valid) { 
      return validationResults; 
     } 
    } 

    return { valid: true, msg: null }; 
}; 

Ogni colonna avrebbe poi bisogno di un validatore entro il quale il valore di default sarebbe confrontato sia un nuovo valore proveniente dal direttore o il valore esistente insieme a tutti gli altri aspetti Convalida richiesta.

var Validator = function(args) { 

    //validate the existing value or the incoming editor value 
    var value = args.newValue ? args.newValue : args.item[args.column.field] 
    var result = value > 0 
    return {valid: result} 
} 

Per convalidare l'intera griglia fornire un metodo di convalida che itera su ogni riga guardando ogni colonna per un validatore. In base ai risultati della convalida, viene creata una mappatura relazionale di rowIndex -> collection of failures per passare all'evento nativo onValidationError. Ciò consente a un abbonamento di gestire la notifica dell'utente della presenza di errori. Inoltre, i risultati della convalida possono essere utilizzati per i guasti di stile da providing specific metadata to the grid

var validateColumns = function(args){ 

var failures=[]; 

for (c in columns) { 
    var column = columns[c] 
    if (column.validator) { 
     if(!column.validator({row: args.row, item: args.item, column: column}).valid){ 
     failures.push({columnIndex: c, column: column, rowIndex: args.row, item: args.item}) 
     } 
    } 
} 
return failures; 
} 

grid.validate = function() { 
    var rowFailures = {} 
    for (r in data) { 
    //ignore our metadata provider (if applicable) 
    if(r == 'getItemMetadata'){continue;} 

    var failures = validateColumns({item: data[r], row: r}) 
    if(failures.length > 0){ 
     rowFailures[r] = failures; 
    } 
    } 

    if(Object.keys(rowFailures).length > 0){ 
    grid.onValidationError.notify({"rowFailures": rowFailures}, new Slick.EventData()) 
    } 
    } 

Fiddle