jQuery Repeater在使用ajax生成的部分中不起作用

时间:2017-05-13 17:35:38

标签: jquery ajax octobercms octobercms-plugins october-partial

在由单个页面中的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>

2 个答案:

答案 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]是新的中继器编号

我花了几天(甚至几天!)来处理这个组件,并且耐心等待,可以做任何你想做的事。

玩得开心!