2012-11-12 11 views
22

Diciamo che ho un AddMethod personalizzato per jQuery Convalida come:messaggi di errore dinamico jQuery confermare con AddMethod basata sull'elemento

$.validator.addMethod('min-length', function (val, element) { 
    // do stuff 

// the error message here needs to be dynamic 
}, 'The field cannot be less than than ' 
    + element.attr('data-min') + // it is within the closure, but it can't grab it 
    ' length.'); 

non riesco a trovare un modo per ottenere il elemento variabile in questione e ottenere qualsiasi valore da esso. Cosa mi manca qui?

+2

[dal documento ation] (http://docs.jquery.com/Plugins/Validation/Validator/addMethod#namemethodmessage), 'addMethod' può assumere una funzione come terza (es. 'messaggio') param. Guarda cosa succede quando passi una funzione e al suo interno 'console.log (this)'. Ci sono buone probabilità che questo sia l'elemento che ti interessa. O forse l'elemento viene passato come parametro, proprio come lo è per l'altra funzione che hai. – meetamit

risposta

55

Guardando il codice sorgente validatore, credo che questo dovrebbe farlo:

$.validator.addMethod('min-length', function (val, element) { 
    return this.optional(element) || val.length >= $(element).data('min'); 
}, function(params, element) { 
    return 'The field cannot be less than than ' + $(element).data('min') + ' length.' 
}); 

Nel codice originale, la stringa di messaggio non rientra la chiusura; la chiusura è il secondo argomento a addMethod, il messaggio di errore è il terzo argomento.

+0

Grazie mille Barmar! Non avevo idea di poterlo fare :) Inoltre hai ragione non è nella chiusura, mio ​​errore. –

+8

Proprio quello che stavo cercando. Un piccolo passo avanti, è possibile costruire un messaggio di errore personalizzato all'interno della funzione di convalida e memorizzarlo nei dati dell'elemento, ad esempio '$ (elemento) .data ('errore', '... messaggio personalizzato ...')' e quindi ripristinarlo nella funzione del messaggio tramite 'return $ (element) .data ('error')' – patricksurry

+1

Un'altra aggiunta è che se c'è un messaggio definito altrove, nel set di regole, ad esempio, questo terzo parametro a 'addMethod 'sarà ignorato. Pensavo che il validatore avrebbe usato prima il parametro, quindi utilizzare il valore predefinito se "null" o una stringa vuota è stata restituita. – ps2goat

3

Prima di tutto, apprezzo la risposta Barmar.

Se si pensa, è possibile utilizzare qualsiasi messaggio di convalida jQuery con il valore del parametro, è possibile chiamare semplicemente le istanze del messaggio.

Ecco il codice

  jQuery.validator.addMethod("custom_min", function(value, element, param) { 
       value = replaceAll(value, ',' , ''); 
       return this.optional(element) || value >= param; 
      },jQuery.validator.messages.min); 

In convalida jQuery

jQuery('#form_id').validate({ 
    rules: { 
    'field_name': { 
     required: true, 
     number: true, 
     custom_min: 1000 
    } 
}); 

Quindi, se si immette qualcosa di meno di 1000. getterà si messaggio di errore, "Si prega di inserire valore maggiore di 1000 (il importo che hai inserito nella convalida) ". Questo metodo sarà più veloce se la tua convalida necessita di modifiche a qualsiasi metodo attuale o lo stai sviluppando con più lingue.

+1

Ho upvoted la tua risposta perché risolve l'esempio presentato nella domanda, ma la risposta di Barmar fornisce una soluzione più generica, che era quello che stavo cercando quando sono atterrato in questa pagina. – cosan

1

Trovato questo caso per caso. I miei messaggi sono molto dinamici a seconda del risultato. così giusto prima chiamo convalida aggiungo un attributo data-msg = "Il mio messaggio personalizzato" all'elemento. Validator raccogliere che fino:

err_msg = 'My custom message'; 
$('#my_element_id').attr('data-msg', err_msg); 
$('#my_form_id').validate().element('input[name=\'my_element_name\''); 

trovato alcuni riferimenti di codice sotto customDataMessage in jquery.validate.js

0

in ritardo alla festa qui, ma questo sembra funzionare per me:

jQuery.validator.addMethod("minDate", function(value, element, param) { 
    var inputDate = new Date(value); 
    return (inputDate >= param) 
    }, function(param, element) { 
     return 'Enter a date greater than or equal to ' + $.datepicker.formatDate("M d, yy", new Date(param)); 
}); 

dove il valore minDate è stato precedentemente impostato sul controllo per convalidare qualcosa del genere:

$('form:first').validate({ 
    rules: { 
     "date-filed": { 
      minDate: new Date(2000,0,0) 
     }, 
... 
Problemi correlati