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())
}
}
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
No, preferirei mantenere la convalida SlickGrid integrata. – jlarson
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