2010-09-20 16 views
9

Ho un modulo Web che funziona con l'estensione LiveValidation. Dispongo di una regola condizionale che, se l'utente seleziona gli Stati Uniti, il campo Stato o provincia deve essere incluso nell'elenco delle abbreviazioni di stato.LiveValidation .remove non funziona

Il mio problema è che se l'utente seleziona Stati Uniti e quindi torna indietro e cambia la risposta, la regola di convalida deve essere rimossa in modo che possano inserire qualsiasi stringa di testo precedente. Ho quadruplicato la mia sintassi e la funzione sta restituendo un oggetto liveValidation piuttosto che un oggetto error ma la regola non viene rimossa. Qualsiasi consiglio sarebbe molto apprezzato.

Ecco lo script:

  if($('#edit-submitted-state-or-province').length){  
      var field12 = new LiveValidation('edit-submitted-state-or-province', { validMessage: " ", onlyOnBlur: true }); 
      field12.add(Validate.Presence, { failureMessage: "Please enter your state or province." } ); 
      } 
      $('#edit-submitted-country').change(function() { 
       var stateList = new Array("","AK"..."WY"); 
       if($("#edit-submitted-country").val() == "United States"){ 
        field12.add(Validate.Inclusion, {within: stateList, failureMessage: "Please enter a valid 2-letter state abbreviation."}); 
       } 
       else{ 
        field12.remove(Validate.Inclusion, {within: stateList, failureMessage: "Please enter a valid 2-letter state abbreviation."}); 
       } 
      }); 
+0

Sto avendo lo stesso problema. Devo abbandonare LiveValidation per questo :(. – benr75

+0

Usa firebug per visualizzare possibili errori Javascript Ci sono errori js? – sergzach

risposta

4

Probabilmente troppo tardi per rispondere a questo, ma qui va ...

La documentazione per LiveValidation.remove afferma che "è necessario passare esattamente gli stessi argomenti, come si usato per aggiungere la convalida ". Sebbene la funzione di convalida (Validate.Inclusion) sia la stessa, l'oggetto parameters sarà diverso ogni volta. Non importa che "guardi" lo stesso (cioè, il risultato se dovessi confrontare il valore di ogni proprietà tra l'oggetto che hai aggiunto e quello che hai rimosso), significa che lo stesso è lo che deve essere lo stesso oggetto. L'unico modo per garantire ciò è spostare la dichiarazione dell'oggetto parametri all'esterno del il callback in cui si sta manipolando l'oggetto di convalida, in modo che venga creato una sola volta e non ogni volta che viene richiamato il callback.

Ecco il codice (ho rinominato i tuoi id, BTW). Mi sono anche assicurato che il controllo di validazione potesse essere aggiunto solo una volta.

$(function() { 

var field12, 
    added = false, 
    stateList = ["", "AK", "CO", "WY"]; // etc 
    params = { 
     within: stateList, 
     failureMessage: "Please enter a valid 2-letter state abbreviation." 
    };  

if ($('#state').length) {  
    field12 = new LiveValidation('state', { 
     validMessage: " ", 
     onlyOnBlur: true 
    }); 

    field12.add(Validate.Presence, { 
     failureMessage: "Please enter your state or province." 
    }); 

} 

$('#country').change(function() { 
    if ($("#country").val() == "United States") { 
     if (!added) { 
      field12.add(Validate.Inclusion, params); 
      added = true; 
     } 
    } 
    else { 
     if (added) { 
      field12.remove(Validate.Inclusion, params); 
      added = false; 
     } 
    } 
}); 

});