在由单个页面中的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>
MY-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>
答案 0 :(得分:0)
好的,我找到了一个解决方案,不是很优雅,但它有效
当带有转发器的部分加载到ajax中时,就好像页面忘记了在页面级别用addJS
声明的脚本,所以我在结束时使用<script src="/path/to/myscript.js">
声明了脚本。直接部分,它的工作原理
尝试使用{% put scripts %}
注入脚本但不起作用
答案 1 :(得分:0)
使用JqueryRepeater就像在地狱中工作。视觉上这太棒了,但是每次编写除基本代码之外的代码都像是在-gg-中踢个脚!
似乎jQuery不能很好地检测每一行的新字段,但是可以使用纯JavaScript。
例如,要更改新生成的输入的值...
Document. getElementsByName ( "your-data-repeater-list[1][field_name]")[0].Value = "My new value";
其中[1]是新的中继器编号
我花了几天(甚至几天!)来处理这个组件,并且耐心等待,可以做任何你想做的事。
玩得开心!