jQuery Repeater не работает в части, сгенерированной с помощью ajax
В форме, состоящей из нескольких шагов, сгенерированных в ajax на одной странице, я должен использовать jquery.repeater на промежуточном этапе.
Код формы, специфичный для повторителя, находится в выделенном
Но jquery.repeater не работает, ничего не происходит, когда я нажимаю на кнопки добавления или удаления, даже без единого сообщения об ошибке javascript в консоли.
Это работает, если я использую эту часть непосредственно на странице без загрузки AJAX.
Обратите внимание, я использую метод частичных обновлений в моем методе обработчика ajax с
return [
'#myDiv' => $this->renderPartial('mypartial')
];
Добро пожаловать на помощь товарищам.
здесь код, который я использую
и сценарии объявления внизу моего макета
...
<!-- Scripts -->
<script src="{{ [
'assets/javascript/jquery-3.2.1.min.js',
]|theme }}"></script>
{% framework extra %}
{% scripts %}
</body>
</html>
мой частичный
<form class="repeater">
<!--
The value given to the data-repeater-list attribute will be used as the
base of rewritten name attributes. In this example, the first
data-repeater-item's name attribute would become group-a[0][text-input],
and the second data-repeater-item would become group-a[1][text-input]
-->
<div data-repeater-list="group-a">
<div data-repeater-item style="display:none;">
<input type="text" name="text-input" />
<input data-repeater-delete type="button" value="Delete" />
</div>
<div data-repeater-item>
<input type="text" name="text-input" />
<input data-repeater-delete type="button" value="Delete" />
</div>
</div>
<input data-repeater-create type="button" value="Add" />
</form>
моя страница
title = "Ajouter"
url = "/tableau-de-bord/espace/ajouter"
layout = "dashboard"
is_hidden = 0
[formulaireCreation]
==
function onStart()
{
$this->addJs('assets/javascript/node_modules/jquery.repeater/jquery.repeater.js');
$this->addJs('assets/javascript/my-repeater.js');
}
==
<div id='formulaire-creation-component-wrapper'>
{% component 'formulaireCreation' %}
</div>
мой-repeater.js
$(document).ready(function () {
$('.repeater').repeater({
// (Optional)
// "show" is called just after an item is added. The item is hidden
// at this point. If a show callback is not given the item will
// have $(this).show() called on it.
show: function () {
$(this).slideDown();
},
// (Optional)
// "hide" is called when a user clicks on a data-repeater-delete
// element. The item is still visible. "hide" is passed a function
// as its first argument which will properly remove the item.
// "hide" allows for a confirmation step, to send a delete request
// to the server, etc. If a hide callback is not given the item
// will be deleted.
hide: function (deleteElement) {
if(confirm('Are you sure you want to delete this element?')) {
$(this).slideUp(deleteElement);
}
},
})
});
И, наконец, для сравнения, код, который работает на базовой странице
title = "repeater-test"
url = "/repeater-test"
layout = "dashboard"
is_hidden = 0
==
function onStart()
{
$this->addJs('assets/javascript/node_modules/jquery.repeater/jquery.repeater.min.js');
$this->addJs('assets/javascript/my-repeater.js');
}
==
<form class="repeater">
<div data-repeater-list="group-a">
<div data-repeater-item style="display:none;">
<input type="text" name="text-input" />
<input data-repeater-delete type="button" value="Delete" />
</div>
<div data-repeater-item>
<input type="text" name="text-input" />
<input data-repeater-delete type="button" value="Delete" />
</div>
</div>
<input data-repeater-create type="button" value="Add" />
</form>
2 ответа
Работа с JqueryRepeater похожа на работу в аду. Визуально это фантастика, но кодирование чего-то другого, кроме базового, похоже на пинок в -gg- каждый раз!
Кажется, что jQuery плохо определяет новые поля каждой строки, но работа с чистым JavaScript возможна.
Например, чтобы изменить значение нового сгенерированного ввода...
Document. getElementsByName ( "your-data-repeater-list[1][field_name]")[0].Value = "My new value";
Где [1] новый номер повторителя
Я потратил несколько дней (и ночей!) На работу с этим компонентом, и с некоторым терпением можно делать все, что вы захотите.
Повеселись!
Хорошо, я нашел решение, не очень элегантно, но оно работает
когда партиал с повторителем загружается в ajax, это как если бы страница забыла скрипт, объявленный с addJS
на уровне страницы, поэтому я объявил скрипт с помощью <script src="/path/to/myscript.js">
в конце частичного непосредственно, и это работает
пытался внедрить скрипт с {% put scripts %}
но не работает