【问题标题】:Rails 4: DOM is ready and AJAX response leads to duplicationRails 4:DOM 准备就绪,AJAX 响应导致重复
【发布时间】:2014-04-10 11:13:07
【问题描述】:

问题

有没有一种很好的技术可以避免在 AJAX 响应中调用相同的代码 javascript(jquery)?

示例

假设我有这些视图和 js 文件

index.html.erb

<div class="listing_users">
  <%= render @users %>
</div>

_user.html.erb

<div class="user">
    <%= @user.name %>
</div>

users.js

$(document).ready(function() {
  $(".user").css({"background-color": "red"})
})

当我通过 AJAX 创建新用户时,我让 rails 在我的 create.js.erb 响应中呈现它。

$(".listing_users").append("<%= j(render(:partial => @users)) %>")
$(".listing_users").css({"background-color": "red"})

$(".listing_users").css({"background-color": "red"}) 行需要用于新渲染的部分。

可能的解决方案

我知道我可以做这样的功能

function set_red(){
  $(".user").css({"background-color": "red"})
}

并且只在 DOM 准备好时和在 AJAX 响应中调用它。但是,这也调用了两次代码。

【问题讨论】:

    标签: javascript jquery html ruby-on-rails ajax


    【解决方案1】:

    您可以在就绪处理程序和 ajax 回调之间共享jquery 'deferred' object

    该对象的done 方法将包含您的代码,而您从ajax 回调和就绪处理程序中调用它的resolve 方法。

    即使请求多次,解决也只会发生一次。

    代码示例:

    // jquery must have been included here
    var g_cbguard = new Deferred();
    g_cbguard
        .done(function () {
            // your code that shall be executed only once
        })
    ;
    // ...
    
    // ready handler
    $(document).ready(function () {
        // ...
        g_cbguard.resolve();
        // ...
    });
    // ...
    
    // somewhere else in your ajax call
    $.ajax(
        //...)
    ).done( function () {
        g_cbguard.resolve();
    });
    // ...
    

    【讨论】:

    • 很好的答案。我不知道jquery 'deferred' object。它不适用于我将 AJAX 与 rails 一起使用的方式,但我正在研究如何将它与 rails 一起使用
    猜你喜欢
    • 1970-01-01
    • 2015-03-04
    • 2012-10-16
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多