2014-07-02 9 views
7

Desidero che il prezzemolo non convalidi un input se non è visibile. Ho un ampio sondaggio in più fasi che rivela nuove sezioni man mano che lo completi. Ogni sezione ha il proprio tag e all'interno di ogni modulo posso avere più sezioni che rivelano mentre le attraversi. Attualmente sto usando 1.x, e questo è come lo faccio ora:Parsley JS 2.x - disabilitazione della convalida per campi non visibili

$('#' + formID).parsley({ 
      errors : { 
       container: function(element) { 
        var $container = element.parent().find('parsley-container'); 
        if($container.length === 0) 
        { 
         if($(element).hasClass('text-hide') && !$(element).hasClass('not-select')) 
         { 
          $(element).prev().addClass('is-error'); 
         } 
         else 
         { 
          $container = $('<div class="parsley-container"></div>').insertAfter(element); 
         } 
        } 
        return $container; 
       } 
      }, 
      listeners: { 
       onFieldValidate: function(elem) { 
        if(!$(elem).is(':visible')) 
        { 
         return true; 
        } 
        return false; 
       } 
      } 

E 'nella sezione di ascoltatori che a convalidare solo i campi che sono visibili. Come posso farlo in Parsley 2.x? Ho esaminato la documentazione e non riesco a trovare un modo equivalente per farlo. So che ci sono gruppi di validazione in 2.x, ma c'è un modo per farlo semplicemente come ho fatto in 1.x?

risposta

11

La soluzione più semplice è quello di escludere tutti gli ingressi nascosti, come questo:

$('#' + formID).parsley({ 
    excluded: "input[type=button], input[type=submit], input[type=reset], input[type=hidden], input:hidden" 
}); 

In questo modo la convalida sarà vincolante solo gli ingressi visibili. Tuttavia, questo ti costringe a distruggere e ad applicare Parsley ogni volta che un input cambia la sua visibilità.

Per evitare questo è possibile utilizzare la seguente soluzione «non così elegante». Questo codice sarebbe migliore nell'evento "prezzemolo: campo: convalida", ma non riuscivo a farlo funzionare.

Utilizzando il "prezzemolo: campo: validato", la convalida è stata già eseguita e ora cambiamo il risultato della convalida su true e nascondiamo il contenitore degli errori. .

$('#' + formID).parsley(); 

$.listen('parsley:field:validated', function(fieldInstance){ 
    if (fieldInstance.$element.is(":hidden")) { 
     // hide the message wrapper 
     fieldInstance._ui.$errorsWrapper.css('display', 'none'); 
     // set validation result to true 
     fieldInstance.validationResult = true; 
     return true; 
    } 
}); 

Come di prezzemolo 2.1 * caso parsley:field:validated lancia il seguente messaggio

modulo PubSub di Prezzemolo è deprecato; utilizzare il metodo di evento jQuery corrispondente invece

Invece di parsley:field:validated si dovrebbe utilizzare l'evento field:validated


Le ultime versioni hanno $.listen() deprecato. Dovresti usare invece Parsley.on(). Esempio:

Parsley.on('field:validated', function(fieldInstance){ 
    if (fieldInstance.$element.is(":hidden")) { 
     // hide the message wrapper 
     fieldInstance._ui.$errorsWrapper.css('display', 'none'); 
     // set validation result to true 
     fieldInstance.validationResult = true; 
     return true; 
    } 
}); 
+0

Ottima risposta, mi ha risparmiato un bel po 'di tempo. Penso che sia piuttosto elegante dato che stai lavorando su un plugin ... – ambe5960

+0

Vorrei aggiungere che vuoi fare attenzione a usare questo, dato che vorrai cancellare le istanze di validazione se cambi la visibilità dei campi nascosti torna a visibile. – ambe5960

+0

@Potherca: grazie per il tuo aggiornamento. Ho provato a testarlo ma stavo usando la versione 2.0.7 invece di 2.1.2 (cdnjs.com non ha l'ultima versione) ed è per questo che ho ripristinato la tua modifica. Dopo aver scavato più a fondo ho capito che era qualcosa a che fare con la versione 2.1 e ho ottimizzato un po 'la tua modifica. Grazie! –

Problemi correlati