MT#12643 Fix adding repeatable element

Make sure to unbind .add_element click handler over full DOM, then
bind it to all .add_elements again. Unbinding avoids multi-firing
of click events causing addition of multiple fields instead of just
one. New binding makes sure that Add keys within the newly added
repeatable also fire a click event.

Change-Id: Ib2f1e7b3df220559d0f86177ce3b067e557f1632
changes/95/1995/2
Andreas Granig 11 years ago
parent abc703a1a5
commit d748aa0c79

@ -13,30 +13,6 @@ sub render_repeatable_js {
my %index;
my %html;
my %level;
use Data::Printer;
my %add_map = ();
my %rep_map = ();
foreach my $f($self->fields) {
# TODO: rather use $f->isa?
p $f;
if((ref $f) =~ /^HTML::FormHandler::Field::AddElement::/) {
print "+++++++++++++++++ a=" . $f->accessor . ", r=" . $f->repeatable . "\n";
$add_map{$f->accessor} = $f->repeatable;
$rep_map{$f->repeatable} = $f->accessor;
} elsif((ref $f) =~ /^HTML::FormHandler::Field::Repeatable::/) {
foreach my $f($f->fields) {
if((ref $f) =~ /^HTML::FormHandler::Field::AddElement::/) {
print "2 +++++++++++++++++ a=" . $f->accessor . ", r=" . $f->repeatable . "\n";
$add_map{$f->accessor} = $f->repeatable;
$rep_map{$f->repeatable} = $f->accessor;
}
}
}
}
p %add_map;
p %rep_map;
my $add_map_str = encode_json(\%add_map);
my $rep_map_str = encode_json(\%rep_map);
foreach my $key ( keys %$for_js ) {
$index{$key} = $for_js->{$key}->{index};
$html{$key} = $for_js->{$key}->{html};
@ -53,8 +29,6 @@ sub render_repeatable_js {
my $js = <<EOS;
<script>
\$(document).ready(function() {
var add_map = $add_map_str;
var rep_map = $rep_map_str;
var rep_index = $index_str;
var rep_html_enc = $html_str;
var rep_html = {};
@ -67,12 +41,10 @@ sub render_repeatable_js {
function on_add_element() {
// get the repeatable id
var data_rep_id = \$(this).attr('data-rep-id');
var add_id = rep_map[data_rep_id];
var id_re = new RegExp('\.[0-9]+\.');
var data_rep_id_0 = data_rep_id.replace(id_re, '.0.');
// create a regex out of index placeholder
var level = rep_level[data_rep_id_0]
var re = new RegExp('\{index-' + level + '\}',"g");
@ -95,7 +67,12 @@ sub render_repeatable_js {
// increment index of repeatable fields
index++;
rep_index[data_rep_id] = index;
//\$('.add_element').click(on_add_element);
// unbind first to not fire it multiple times
\$('.add_element').unbind('click');
// bind click for any add_element elems, also those nested in the
// now newly added repeatable
\$('.add_element').click(on_add_element);
// initiate callback if there is a handler for that
if(typeof repeatadd_handler !== "undefined" && repeatadd_handler != null) {

Loading…
Cancel
Save