Строки таблицы jQuery не будут отображаться в элементе таблицы - PullRequest
0 голосов
/ 09 декабря 2018

Я использую jQuery для добавления и удаления строк таблицы для набора форм внутри другой формы в Symfony 4. Это было непросто, но в итоге заставило его работать.С помощью макроса в Twig я могу получить результат рендеринга:

<table>
  <div id="document-list" data-prototype="
    <tr>
        <td>
           <fieldset class=&quot;form-group&quot;>
             <div id=&quot;program_programDocument___name__&quot; novalidate=&quot;novalidate&quot;>
                <div class=&quot;form-group&quot;><input type=&quot;text&quot; id=&quot;program_programDocument___name___name&quot; name=&quot;program[programDocument][__name__][name]&quot; required=&quot;required&quot; class=&quot;form-control&quot;/>
                </div>
             </div>
          </fieldset>
       </td>
       <td>
          <button type=&quot;button&quot;class=&quot;remove-collection-widget&quot;data-list=&quot;#remove-collection-widget&quot;>Remove</button>
       </td>
    </tr>" data-widget-tags="<div></div>">
  </div>
</table>
<button type="button" class="add-another-collection-widget" data-list="#document-list">Add document</button>

Я максимально очистил этот код, чтобы сделать его читаемым.Весь HTML внутри data-prototype="...." такой, каким он должен быть.Мой код работает (ish) вместе с некоторым jQuery:

jQuery('.add-another-collection-widget').click(function(e) {
  var list = jQuery(jQuery(this).attr('data-list'));
  // Try to find the counter of the list or use the length of the list
  var counter = list.data('widget-counter') | list.children().length;
  // grab the prototype template
  var newWidget = list.attr('data-prototype');
  // replace the "__name__" used in the id and name of the prototype
  // with a number that's unique to your emails
  // end name attribute looks like name="contact[emails][2]"
  newWidget = newWidget.replace(/__name__/g, counter);
  // Increase the counter
  counter++;
  // And store it, the length cannot be used if deleting widgets is allowed
  list.data('widget-counter', counter);

  // create a new list element and add it to the list
  var newElem = jQuery(list.attr('data-widget-tags')).html(newWidget);
  newElem.appendTo(list);
});
$(function() {
  $(document).on("click", ".remove-collection-widget", function() {
    $(this).closest("tr").remove();
  });
});

Проблема в том, что результат при добавлении большего количества строк формы заключается в том, что они фактически не попадают в таблицу.Вы можете сами убедиться ( JSFiddle ), что результат выглядит хорошо, но на самом деле это не так.

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

1 Ответ

0 голосов
/ 09 декабря 2018

Помещение div в качестве прямого дочернего элемента table не является правильным HTML, что и вызывает его.

  • Перемещение id="document-list" data-prototype="... в table элемент
  • Избавьтесь от div внутри table
  • Измените data-widget-tags на tr вместо div
  • Удалите упаковку tr с data-prototype

Решение

jQuery('.add-another-collection-widget').click(function(e) {
  var list = jQuery(jQuery(this).attr('data-list'));
  var counter = list.data('widget-counter') | list.children().length;
  var newWidget = list.attr('data-prototype');
  newWidget = newWidget.replace(/__name__/g, counter);
  counter++;
  list.data('widget-counter', counter);
  var newElem = jQuery(list.attr('data-widget-tags')).html(newWidget);
  newElem.appendTo(list);
});

$(function() {
  $(document).on("click", ".remove-collection-widget", function() {
    $(this).closest("tr").remove();
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table id="document-list" data-prototype="
        <td>
           <fieldset class=&quot;form-group&quot;>
             <div id=&quot;program_programDocument___name__&quot; novalidate=&quot;novalidate&quot;>
                <div class=&quot;form-group&quot;><input type=&quot;text&quot; id=&quot;program_programDocument___name___name&quot; name=&quot;program[programDocument][__name__][name]&quot; required=&quot;required&quot; class=&quot;form-control&quot;/>
                </div>
             </div>
          </fieldset>
       </td>
       <td>
          <button type=&quot;button&quot;class=&quot;remove-collection-widget&quot;data-list=&quot;#remove-collection-widget&quot;>Remove</button>
       </td>" data-widget-tags="<tr></tr>">
</table>
<button type="button" class="add-another-collection-widget" data-list="#document-list">Add document</button>

Документация

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/table (см. Разрешенное содержимое)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...