Динамически генерируемые поля ввода из буквенного шаблона JS: входные значения не отображаются - PullRequest
0 голосов
/ 31 марта 2020

Я решил эту проблему и буду признателен за любую помощь - она ​​может быть чем-то очевидным, но пока я не могу понять, в чем дело.

Некоторый контекст:

Я динамически добавляю «группу» полей в форме, описывающей человека. Эти поля могут быть пустыми для всей новой записи, или пользователь может выбрать из списка существующих людей (описанных как гости), который я представляю в div. Пользователь может щелкнуть по каждому из этих гостевых элементов и добавить новую строку групповых входов с уже установленными значениями ввода.

Вот где у меня проблема. Я могу добавить новую строку групповых входов, и для входов установлено их значение, но значение не отображается внутри полей ввода.

JSFiddle Link: https://jsfiddle.net/joomquery/odgp2wre

Заранее спасибо

(function($) {
  $(document).ready(function() {

    let passengersRows = $('.booking-passenger-entry');
    let passengersRowsI = passengersRows.length;

    $('.add-guest-as-passenger').on('click', function() {
      let passengerData = {};
      console.clear();
      console.log(this);
      passengerData.guestid = $(this).attr('data-guestid');
      passengerData.passengerid = 0;
      passengerData.lastname = $(this).attr('data-lastname');
      passengerData.firstname = $(this).attr('data-firstname');
      passengerData.passportid = $(this).attr('data-passportid');
      passengerData.age = $(this).attr('data-age');
      passengerData.gender = $(this).attr('data-gender');

      addPassenger(passengerData);
    });

    function addPassenger(passenger) {
      passengersRowsI++;
      let i = passengersRowsI;
      let container = $('#passengers-container');
      let genderSelectOptionA = `<option value="0">Unspecified</option>`;
      let genderSelectOptionB = `<option value="1">Male</option>`;
      let genderSelectOptionC = `<option value="2">Female</option>`;
      if (passenger.gender == 'Male') {
        genderSelectOptionB = `<option value="1" selected>Male</option>`;
      } else if (passenger.gender == 'Female') {
        genderSelectOptionC = `<option value="2" selected>Female</option>`;
      }
      console.clear();
      console.log(passenger);
      let passengerTemplate = `
<div class="row-fluid booking-passenger-entry inputform" id="passengers-container-${i}" data-guestid="${passenger.guestid}" data-passengerid="">
  <input type="text" required id="input-name-last-${i}" name="passengers[${i}][name-last]" class="span3 b-guest-i input name-last" placeholder="Last name" val="John" >
  <input type="text" required id="input-name-first-${i}" name="passengers[${i}][name-first]" class="span3 b-guest-i input name-first" placeholder="First name" val="${passenger.firstname}" >
  <input type="text" required id="input-passport-${i}" name="passengers[${i}][passport]" class="span2 b-guest-i input passport" placeholder="Passport ID" val="${passenger.passportid}" >
  <input type="text" required id="input-age-${i}" name="passengers[${i}][age]" class="span1 b-guest-i input age" placeholder="Age" val="${passenger.age}" >
  <select id="input-gender-${i}" required name="passengers[${i}][gender]" class="span2 b-guest-i input gender">
    ${genderSelectOptionA}
    ${genderSelectOptionB}
    ${genderSelectOptionC}
  </select>
  <div class="btn-group span1 pull-right">
	  <div id="passenger-delete-${i}" class="btn btn-danger"><i class="fa fa-minus-circle" aria-hidden="true"></i></div>
  </div>
  <input type="hidden" id="input-passengerid-${i}" name="passengers[${i}][passengerid]" class="hidden b-guest-i input" val="" >
  <input type="hidden" id="input-guestid-${i}" name="passengers[${i}][guestid]" class="hidden b-guest-i input" val="${passenger.guestid}" >
</div>`;
      $(container).append(passengerTemplate);

    }

  });
})(jQuery);
.booking-passenger-entry {
    padding: 0.3125rem 0;
}
.booking-guest {
  margin: 1px 0;
  padding: 0.3125rem !important;
  line-height: 1rem;
  cursor: pointer;
  border-right: 1px solid #ddd;
  border-bottom: 1px solid #ddd;
  border-left: 1px solid #ddd;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<div id="booking-passengers" class="row-fluid req-passengers" style="">
  <div class="controls">
    <div class="passengerlist">
      <h3>Dynamic guestlist:</h3>
      <div class="row-fluid booking-guest booking-guest-headings">
        <span class="span3 b-guest-i b-guest-h name-last">Last name</span>
        <span class="span3 b-guest-i b-guest-h name-first">First name</span>
        <span class="span2 b-guest-i b-guest-h passport">Passport ID</span>
        <span class="span1 b-guest-i b-guest-h age">Age</span>
        <span class="span2 b-guest-i b-guest-h gender">Gender</span>
      </div>

      <div id="passengers-container" class="passengers-container" style="border:1px solid #aaa; min-height: 30px; background: #fafafa;">
      </div>

      <div class="guestlist">
        <h3>You may add passengers from your booking's guestlist</h3>
        <div class="row-fluid booking-guest booking-guest-headings">
          <span class="span3 b-guest-i b-guest-h name-last">Last name</span>
          <span class="span3 b-guest-i b-guest-h name-first">First name</span>
          <span class="span3 b-guest-i b-guest-h passport">Passport ID</span>
          <span class="span1 b-guest-i b-guest-h age">Age</span>
          <span class="span2 b-guest-i b-guest-h gender">Gender</span>
        </div>
        <div class="row-fluid booking-guest add-guest-as-passenger" id="booking-guest-8" data-guestid="8" data-passengerid="0" data-firstname="SomeoneF1" data-lastname="SomeoneL1" data-passportid="XX2255551" data-age="43" data-gender="Male">
          <span class="span3 b-guest-i name-last">SomeoneL1</span>
          <span class="span3 b-guest-i name-first">SomeoneF1</span>
          <span class="span3 b-guest-i passport">XX2255551</span>
          <span class="span1 b-guest-i age">43</span>
          <span class="span2 b-guest-i gender">Male</span>
        </div>
        <div class="row-fluid booking-guest add-guest-as-passenger" id="booking-guest-12" data-guestid="12" data-passengerid="0" data-firstname="SomeoneF2" data-lastname="SomeoneL2" data-passportid="XX0011221" data-age="41" data-gender="Unspecified">
          <span class="span3 b-guest-i name-last">SomeoneL2</span>
          <span class="span3 b-guest-i name-first">SomeoneF2</span>
          <span class="span3 b-guest-i passport">XX0011221</span>
          <span class="span1 b-guest-i age">41</span>
          <span class="span2 b-guest-i gender">Unspecified</span>
        </div>
      </div>
    </div>
  </div>
</div>

Ответы [ 2 ]

1 голос
/ 31 марта 2020

В этом примере я обнаружил, что проще просто поместить нужную разметку для входной группы, спрятать ее и затем клонировать для каждого экземпляра. Я оставлю это вам на том, как вы на самом деле используете данные, я также удалил все идентификаторы, поэтому дублирующий идентификатор не вставляется. Если вам нужны идентификаторы, вы можете настроить разметку клона, чтобы они были.

Преимущество этого заключается в том, что вам не нужно сохранять HTML в коде.

(function($) {
    let passengersRows = $('.booking-passenger-entry');
    let passengersRowsI = passengersRows.length;

    $('.add-guest-as-passenger').on('click', function() {
      let passengerData = {};
      passengerData.guestid = $(this).data('guestid');
      passengerData.passengerid = 0;
      passengerData.lastname = $(this).data('lastname');
      passengerData.firstname = $(this).data('firstname');
      passengerData.passportid = $(this).data('passportid');
      passengerData.age = $(this).data('age');
      passengerData.gender = $(this).data('gender');
      addPassenger(passengerData);
    });

    function addPassenger(passenger) {
      let container = $('#passengers-container');
      let inputGroups = container.find('.booking-passenger-entry');
      let clone = container.find('.hidden-input-group').first().clone(true);
      let i = inputGroups.length;
      // might want this>
      // passenger.passengerid = i;
      let gender = clone.find('.input.gender');
      if (passenger.gender == 'Male') {
        gender.val(1);
      } else if (passenger.gender == 'Female') {
        gender.val(2);;
      }

      clone.find('.name-first').val(passenger.firstname);
      clone.find('.name-last').val(passenger.lastname);
      clone.data('guestid', passenger.guestid);
      clone.data('passengerid', passenger.passengerid);
      clone.find('.input.passport').val(passenger.passportid);
      clone.find('.input.age').val(passenger.age);
      clone.removeClass("hidden-input-group");
      container.append(clone);
    }
})(jQuery);
.booking-passenger-entry {
  padding: 0.3125rem 0;
}

.booking-guest {
  margin: 1px 0;
  padding: 0.3125rem !important;
  line-height: 1rem;
  cursor: pointer;
  border-right: 1px solid #ddd;
  border-bottom: 1px solid #ddd;
  border-left: 1px solid #ddd;
}

.hidden-input-group {
  display: none;
}

#passengers-container {
  border: 1px solid #aaa;
  min-height: 50px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="booking-passengers" class="row-fluid req-passengers" style="">
  <div class="controls">
    <div class="passengerlist">
      <h3>Dynamic guestlist:</h3>
      <div class="row-fluid booking-guest booking-guest-headings">
        <span class="span3 b-guest-i b-guest-h name-last">Last name</span>
        <span class="span3 b-guest-i b-guest-h name-first">First name</span>
        <span class="span2 b-guest-i b-guest-h passport">Passport ID</span>
        <span class="span1 b-guest-i b-guest-h age">Age</span>
        <span class="span2 b-guest-i b-guest-h gender">Gender</span>
      </div>
      <div id="passengers-container" class="passengers-container">
        <div class="row-fluid booking-passenger-entry inputform hidden-input-group" data-guestid="" data-passengerid="">
          <input type="text" required data-name="" class="span3 b-guest-i input name-last " placeholder="Last name" />
          <input type="text" required class="span3 b-guest-i input name-first" placeholder="First name" />
          <input type="text" required class="span2 b-guest-i input passport" placeholder="Passport ID" />
          <input type="text" required class="span1 b-guest-i input age" placeholder="Age" />
          <select required class="span2 b-guest-i input gender">
            <option value="0">Unspecified</option>
            <option value="1">Male</option>
            <option value="2">Female</option>
          </select>
          <div class="btn-group span1 pull-right">
            <div class="passenger-delete btn btn-danger"><i class="fa fa-minus-circle" aria-hidden="true"></i></div>
          </div>
          <input type="hidden" class="hidden b-guest-i input" />
          <input type="hidden" class="hidden b-guest-i input" />
        </div>
      </div>
      <div class="guestlist">
        <h3>You may add passengers from your booking's guestlist</h3>
        <div class="row-fluid booking-guest booking-guest-headings">
          <span class="span3 b-guest-i b-guest-h name-last">Last name</span>
          <span class="span3 b-guest-i b-guest-h name-first">First name</span>
          <span class="span3 b-guest-i b-guest-h passport">Passport ID</span>
          <span class="span1 b-guest-i b-guest-h age">Age</span>
          <span class="span2 b-guest-i b-guest-h gender">Gender</span>
        </div>
        <div class="row-fluid booking-guest add-guest-as-passenger" id="booking-guest-8" data-guestid="8" data-passengerid="0" data-firstname="SomeoneF1" data-lastname="SomeoneL1" data-passportid="XX2255551" data-age="43" data-gender="Male">
          <span class="span3 b-guest-i name-last">SomeoneL1</span>
          <span class="span3 b-guest-i name-first">SomeoneF1</span>
          <span class="span3 b-guest-i passport">XX2255551</span>
          <span class="span1 b-guest-i age">43</span>
          <span class="span2 b-guest-i gender">Male</span>
        </div>
        <div class="row-fluid booking-guest add-guest-as-passenger" id="booking-guest-12" data-guestid="12" data-passengerid="0" data-firstname="SomeoneF2" data-lastname="SomeoneL2" data-passportid="XX0011221" data-age="41" data-gender="Unspecified">
          <span class="span3 b-guest-i name-last">SomeoneL2</span>
          <span class="span3 b-guest-i name-first">SomeoneF2</span>
          <span class="span3 b-guest-i passport">XX0011221</span>
          <span class="span1 b-guest-i age">41</span>
          <span class="span2 b-guest-i gender">Unspecified</span>
        </div>
      </div>
    </div>
  </div>
</div>
1 голос
/ 31 марта 2020

Вы почти там, только одно изменение, которое вам нужно сделать.

Измените имя атрибута с val на value в ваших passengerTemplate элементах ввода.

(function($) {
  $(document).ready(function() {

    let passengersRows = $('.booking-passenger-entry');
    let passengersRowsI = passengersRows.length;

    $('.add-guest-as-passenger').on('click', function() {
      let passengerData = {};
      console.clear();
      console.log(this);
      passengerData.guestid = $(this).attr('data-guestid');
      passengerData.passengerid = 0;
      passengerData.lastname = $(this).attr('data-lastname');
      passengerData.firstname = $(this).attr('data-firstname');
      passengerData.passportid = $(this).attr('data-passportid');
      passengerData.age = $(this).attr('data-age');
      passengerData.gender = $(this).attr('data-gender');

      addPassenger(passengerData);
    });

    function addPassenger(passenger) {
      passengersRowsI++;
      let i = passengersRowsI;
      let container = $('#passengers-container');
      let genderSelectOptionA = `<option value="0">Unspecified</option>`;
      let genderSelectOptionB = `<option value="1">Male</option>`;
      let genderSelectOptionC = `<option value="2">Female</option>`;
      if (passenger.gender == 'Male') {
        genderSelectOptionB = `<option value="1" selected>Male</option>`;
      } else if (passenger.gender == 'Female') {
        genderSelectOptionC = `<option value="2" selected>Female</option>`;
      }
      console.clear();

      let passengerTemplate = `
			<div class="row-fluid booking-passenger-entry inputform" id="passengers-container-${i}" data-guestid="${passenger.guestid}" data-passengerid="">
				<input type="text" required id="input-name-last-${i}" name="passengers[${i}][name-last]" class="span3 b-guest-i input name-last" placeholder="Last name" value="John" >
				<input type="text" required id="input-name-first-${i}" name="passengers[${i}][name-first]" class="span3 b-guest-i input name-first" placeholder="First name" value="${passenger.firstname}" >
				<input type="text" required id="input-passport-${i}" name="passengers[${i}][passport]" class="span2 b-guest-i input passport" placeholder="Passport ID" value="${passenger.passportid}" >
				<input type="text" required id="input-age-${i}" name="passengers[${i}][age]" class="span1 b-guest-i input age" placeholder="Age" value="${passenger.age}" >
				<select id="input-gender-${i}" required name="passengers[${i}][gender]" class="span2 b-guest-i input gender">
					${genderSelectOptionA}
					${genderSelectOptionB}
					${genderSelectOptionC}
				</select>
				<div class="btn-group span1 pull-right">
					<div id="passenger-delete" class="btn btn-danger"><i class="fa fa-minus-circle" aria-hidden="true"></i></div>
				</div>
				<input type="hidden" id="input-passengerid-${i}" name="passengers[${i}][passengerid]" class="hidden b-guest-i input" value="" >
				<input type="hidden" id="input-guestid-${i}" name="passengers[${i}][guestid]" class="hidden b-guest-i input" value="${passenger.guestid}" >

			</div>`;
      $(container).append(passengerTemplate);

    }

  });
})(jQuery);
.booking-passenger-entry {
    padding: 0.3125rem 0;
}
.booking-guest {
  margin: 1px 0;
  padding: 0.3125rem !important;
  line-height: 1rem;
  cursor: pointer;
  border-right: 1px solid #ddd;
  border-bottom: 1px solid #ddd;
  border-left: 1px solid #ddd;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<div id="booking-passengers" class="row-fluid req-passengers" style="">
  <div class="controls">
    <div class="passengerlist">
      <h3>Dynamic guestlist:</h3>
      <div class="row-fluid booking-guest booking-guest-headings">
        <span class="span3 b-guest-i b-guest-h name-last">Last name</span>
        <span class="span3 b-guest-i b-guest-h name-first">First name</span>
        <span class="span2 b-guest-i b-guest-h passport">Passport ID</span>
        <span class="span1 b-guest-i b-guest-h age">Age</span>
        <span class="span2 b-guest-i b-guest-h gender">Gender</span>
      </div>

      <div id="passengers-container" class="passengers-container" style="border:1px solid #aaa; min-height: 30px; background: #fafafa;">
      </div>

      <div class="guestlist">
        <h3>You may add passengers from your booking's guestlist</h3>
        <div class="row-fluid booking-guest booking-guest-headings">
          <span class="span3 b-guest-i b-guest-h name-last">Last name</span>
          <span class="span3 b-guest-i b-guest-h name-first">First name</span>
          <span class="span3 b-guest-i b-guest-h passport">Passport ID</span>
          <span class="span1 b-guest-i b-guest-h age">Age</span>
          <span class="span2 b-guest-i b-guest-h gender">Gender</span>
        </div>
        <div class="row-fluid booking-guest add-guest-as-passenger" id="booking-guest-8" data-guestid="8" data-passengerid="0" data-firstname="SomeoneF1" data-lastname="SomeoneL1" data-passportid="XX2255551" data-age="43" data-gender="Male">
          <span class="span3 b-guest-i name-last">SomeoneL1</span>
          <span class="span3 b-guest-i name-first">SomeoneF1</span>
          <span class="span3 b-guest-i passport">XX2255551</span>
          <span class="span1 b-guest-i age">43</span>
          <span class="span2 b-guest-i gender">Male</span>
        </div>
        <div class="row-fluid booking-guest add-guest-as-passenger" id="booking-guest-12" data-guestid="12" data-passengerid="0" data-firstname="SomeoneF2" data-lastname="SomeoneL2" data-passportid="XX0011221" data-age="41" data-gender="Unspecified">
          <span class="span3 b-guest-i name-last">SomeoneL2</span>
          <span class="span3 b-guest-i name-first">SomeoneF2</span>
          <span class="span3 b-guest-i passport">XX0011221</span>
          <span class="span1 b-guest-i age">41</span>
          <span class="span2 b-guest-i gender">Unspecified</span>
        </div>
      </div>
    </div>
  </div>
</div>

Обновление: Поскольку id одинаковы в вашем коде и недействительны, рассмотрите возможность изменения id с присвоением индекса типа,

   id="input-name-last-${i}"

   id="input-name-first-${i}"
...