如何在Ajax请求后在Rails中重新注册常见javascript事件

如何在Ajax请求后在Rails中重新注册常见javascript事件,javascript,jquery,ruby-on-rails,ajax,Javascript,Jquery,Ruby On Rails,Ajax,我正在编写一个Rails应用程序,其中包括使用jQuery的ajax功能。我希望你们能帮我 例如,在my/public/javascripts/application.js中: /* application.js */ ... $('.item-edit').editable('/item/update', { name : $(this).attr('name'), id : $(this).attr('id'), cancel : 'Cancel',

我正在编写一个Rails应用程序,其中包括使用jQuery的ajax功能。我希望你们能帮我

例如,在my/public/javascripts/application.js中:

/* application.js */ ... $('.item-edit').editable('/item/update', { name : $(this).attr('name'), id : $(this).attr('id'), cancel : 'Cancel', submit : 'OK', indicator : 'Saving...', tooltip : 'Click to edit...', method : 'put', submitdata : {attribute : "name"} }); /*application.js*/ ... $('.item edit')。可编辑('/item/update'{ 名称:$(this.attr('name'), id:$(this.attr('id'), 取消:“取消”, 提交:“OK”, 指标:“正在保存…”, 工具提示:“单击以编辑…”, 方法:'放', submitdata:{属性:“名称”} }); 使用jEditable插件,该代码绑定已注册的元素以进行内联编辑

假设我在app/views/shared/_item_info.html.erb中有一个部分

<!-- _item_info.html.erb -->
...
<li class="item-edit" id="<%= item.id %>"><%= item.name %> </li>
...

...
  • ...
  • 在第一次加载时,当单击任何“项目编辑”元素时,用户将看到一个带有“确定”按钮的内联文本框。单击“确定”后,将提交一个“放置”请求,从而保存该文本。将该文本保存到数据库中后,我们将通过调用以下部分来呈现新文本:

    这就是我的update.js.erb的样子:

    /* update.js.erb */
    ...
    $("#items").html("<%= escape_javascript(render('shared/item_info')) %>")
    
    $('.item-edit').editable('/item/update', {
        name  : $(this).attr('name'),
        id  : $(this).attr('id'),
        cancel  : 'Cancel',
        submit  : 'OK',
        indicator : 'Saving...',
        tooltip  : 'Click to edit...',
        method  :  'put',
        submitdata  :  {attribute : "name"}
    });
    ...
    
    /*update.js.erb*/
    ...
    $(“#项”).html(“”)
    $('.item edit')。可编辑('/item/update'{
    名称:$(this.attr('name'),
    id:$(this.attr('id'),
    取消:“取消”,
    提交:“OK”,
    指标:“正在保存…”,
    工具提示:“单击以编辑…”,
    方法:'放',
    submitdata:{属性:“名称”}
    });
    ...
    
    您可能已经注意到,我必须重新注册我的元素以启用内联编辑,如果没有,单击元素将不会起任何作用。我的问题是,我正在其他请求(如create.js.erb)中重新注册其他事件,这会导致大量代码重复

    这个问题有什么解决办法吗?是否有一种方法可以将所有常见事件重新注册代码放在一个.js文件中,并将其包含在create.js.erb、update.js.erb…中,这样所有事件都可以重新注册,而无需复制/粘贴代码


    对不起,说得太多了。如果能得到任何帮助,我将不胜感激。

    我提出了一个解决方案,虽然不美观,但它现在可以帮助消除代码重复

    我刚刚在我的部分中添加了这一点:

    <!-- _item_info.html.erb -->
    ...
    <li class="item-edit" id="<%= item.id %>"><%= item.name %> </li>
    ...
    <% javascript_tag  do -%>
        $('.item-edit').editable('/item/update', {
            name  : $(this).attr('name'),
            id  : $(this).attr('id'),
            cancel  : 'Cancel',
            submit  : 'OK',
            indicator : 'Saving...',
            tooltip  : 'Click to edit...',
            method  :  'put',
            submitdata  :  {attribute : "name"}
        });
    ...
    
    
    ...
    
  • ... $('.item edit')。可编辑('/item/update'{ 名称:$(this.attr('name'), id:$(this.attr('id'), 取消:“取消”, 提交:“OK”, 指标:“正在保存…”, 工具提示:“单击以编辑…”, 方法:'放', submitdata:{属性:“名称”} }); ...

  • 我不再需要在我的.js.erb文件中进行任何重新注册。

    jQuery提供了一种很棒的方法,名为.live(docs:)

    但是,由于您使用插件并调用.editable进行绑定,因此您必须修改要使用.live的jEditable的源代码,这可能(也可能不会)比它的价值更大

    实际上,似乎还有其他一些非常类似的问题:


    但两者都没有完美的解决方案,但值得一看

    是的,你可以这样做。。。或者,如果希望将javascript保存在js.erb文件中,则update.js.erb可以找到最近的.item编辑节点。如果将此节点追加到其余项的末尾,则可以对从$('.item edit')获得的数组进行索引,其长度为-1