2013-12-13 6 views
15

Ho un modulo in cui sto avendo alcuni campi e quindi se necessario, l'utente può aggiungere più campi dello stesso tipo. Sto usando http://jqueryvalidation.org/ validate plugin per convalidare i campi.jquery convalida plug-in su input di moduli dinamici non funzionanti

Come ho letto da qualche parte il plugin jquery validate richiede nomi univoci ai campi per convalidarli. Quindi sto nominando ogni campo in modo univoco. Innanzitutto speravo che il plugin di convalida si occupasse della convalida dell'elemento aggiunto dinamicamente se aggiungo regole usando le classi. Ma si scopre che non è così.

Quindi, anche se il nome di ciascun campo è univoco, il plug-in di convalida convalida solo il primo input che è stato inizialmente visualizzato.

Ho anche provato a utilizzare $.clone() nella speranza che si occuperà di tutte le associazioni di eventi. Ma non ha funzionato per me. Quindi mi sono spostato in underscore per ripetere il markup dato che ci sono un certo numero di campi e non voglio scrivere template in JS e nominare di conseguenza.

Non riesco a trovare una soluzione a questo e bloccato qui. Non posso più fino a quando questo problema non sarà risolto.

Ecco JS che ho scritto.

$("#work_form").validate(); 

$(".work_emp_name").rules("add", { 
    required: true 
}); 

_.templateSettings.variable = "element"; 
var tpl = _.template($("#form_tpl").html()); 

var counter = 1; 

$("form").on("click", ".add_employer", function (e) { 
    e.preventDefault(); 
    var tplData = { 
     i: counter 
    }; 
    $("#word_exp_area").append(tpl(tplData)); 
    counter += 1; 
}); 

Si prega di trovare il markup in violino istituito.

example and code set up here

+0

Ma la convalida nell'esempio che hai dato non funziona. –

+0

@SukhwinderSodhi funziona. – SachinGutte

+0

funziona bene su Prima, ma quando viene aggiunto un nuovo datore di lavoro e lo si salva senza riempire l'altro dipendente, salva i dati –

risposta

34

Quando si utilizza uno dei metodi di questo plug-in, come .rules(), e il targeting più di un elemento, come un class, è necessario utilizzare anche il metodo di jQuery .each().

$('.work_emp_name').each(function() { 
    $(this).rules("add", { 
     required: true 
    }); 
}); 

E non si può utilizzare .rules() su elementi che non esistono ancora nel DOM. È sufficiente spostare il metodo .rules() all'interno della funzione che crea i nuovi input.

$("form").on("click", ".add_employer", function (e) { 
    e.preventDefault(); 
    var tplData = { 
     i: counter 
    }; 
    $("#word_exp_area").append(tpl(tplData)); 
    counter += 1; 
    $('.work_emp_name').each(function() { 
     $(this).rules("add", { 
      required: true 
     }); 
    }); 
}); 

demo funzionante: http://jsfiddle.net/Yy2gB/10/


Tuttavia, è possibile rendere più efficiente da un solo mira quello nuovo campo, invece di tutti i campi con l'work_emp_nameclass.

$("form").on("click", ".add_employer", function (e) { 
    e.preventDefault(); 
    var tplData = { 
     i: counter 
    }; 
    $("#word_exp_area").append(tpl(tplData)); // <- add new field 
    $('input[name="work_emp_name['+counter+']"]').rules("add", { // <- apply rule to new field 
     required: true 
    }); 
    counter += 1; 
}); 

demo funzionante: http://jsfiddle.net/Yy2gB/11/


Entrambi i miei esempi sopra riportati sono per l'aggiunta di regole per i campi creati dinamicamente.Avrai ancora bisogno di dichiarare tutte le regole per i vostri campi statici su pronto dom come segue ...

$("#work_form").validate({ 
    rules: { 
     "work_emp_name[0]": { 
      required: true 
     } 
    } 
}); 
+2

solo per risparmiare tempo (o per ora) ho appena aggiunto 'data-rule-required =" true "' nel template stesso. Ciò impone anche le regole di convalida sugli elementi dinamici. E mi piacciono 8 campi che vengono ripetuti con un solo clic del pulsante "Aggiungi datore di lavoro" (designazione, ambito di lavoro, data di inizio e fine, lettere degli appuntamenti e così via). Quindi, se voglio aggiungere regole anche a questi campi, dovrei scrivere lo stesso codice nel listener dei clic di Aggiungi datore di lavoro. È troppo. Invece ho scelto il metodo degli attributi dei dati per aggiungere regole di validazione. – SachinGutte

+0

Ma aggiungere regole tramite attributi di dati non dà più controllo come se ci fossero campi che dipendono dai valori di altri campi. Quindi la tua risposta soddisfa tutti questi scenari e dà più controllo. Quindi è il modo corretto. Grazie per aver dedicato del tempo per risolvere questo. – SachinGutte

+2

Forse è una domanda vaga ma non un plugin come validate dovrebbe prendersi cura dei campi aggiunti dinamicamente o aggiungere regole con le classi senza usare '$ .each' al primo posto? Ora so che è scritto abbastanza bene e ha molte opzioni, ma voglio dire che queste sono le cose basilari che un plugin dovrebbe avere. – SachinGutte

3

Restituisce le regole convalide per il primo elemento selezionato o aggiunge le regole specificate e restituisce tutte le regole per il primo elemento corrispondente. Richiede che il modulo padre sia convalidato, ovvero $ ("form") .validate() viene chiamato per primo o

Rimuove le regole specificate e restituisce tutte le regole per il primo elemento corrispondente. more info

function addRule(id){ 
    $("[name='work_emp_name["+id+"]']").rules("add", { 
     required: true 
    }); 
} 
$("#work_form").validate(); 
addRule(0); 

_.templateSettings.variable = "element"; 
var tpl = _.template($("#form_tpl").html()); 

var counter = 1; 

$("form").on("click", ".add_employer", function (e) { 
    e.preventDefault(); 
    var tplData = { 
     i: counter 
    }; 
    $("#word_exp_area").append(tpl(tplData)); 
    addRule(counter); 
    counter += 1; 
}); here 
+0

Giusta idea, ma sembra un po 'più prolisso del necessario. – Sparky

+0

@Sparky in questo jsfiddle.net/Yy2gB/9 il tuo esempio in pratica hai fatto la stessa cosa, solo che funzionerà solo su nuovi elementi, non su quelli esistenti. – nzn

+0

La mia supervisione. Quello esistente può essere dichiarato quando la pagina viene inizializzata o tramite HTML in linea. Risolto il problema con la mia risposta Grazie. – Sparky

1

Questo perché jQuery Validation convalida solo la prima occorrenza della matrice al momento.

È possibile controllare il mio commit sul plug-in che funzionerà correttamente su qualsiasi occorrenza dell'array denominato.

Problemi correlati