代码之家  ›  专栏  ›  技术社区  ›  Alex Reisner

使用不引人注目的JavaScript更新元素

  •  2
  • Alex Reisner  · 技术社区  · 14 年前

    如您所知,当您从Rails 2升级到Rails 3时,您将替换以下内容:

    link_to_remote "more", :url => {...}
    

    有了这个:

    link_to "more", {...}, :remote => true
    

    但是如何处理link\u to\u remote中的:update选项呢?在 Railscast #205 Ryan Bates演示 link_to 具有 :remote

    那么,明确地说,有没有办法做到这一点:

    link_to_remote "more", :url => {...}, :update => "products-list"
    

    如果是后者,请描述最好的方法(可以吗 链接到 :远程

    3 回复  |  直到 14 年前
        1
  •  2
  •   Alex Reisner    14 年前

    我不是百分之百确定这是Rails认可的方法,但是我已经找到了一个有效的解决方案,看起来相当干净。假设我们有一个页面,列出了数据库中最受欢迎的十种产品。最后是一个通过AJAX加载所有剩余产品的链接:

    <ul id="products-list">
      <li>...</li>
      <li>...</li>
      <li>...</li>
      ...
    </ul>
    <%= link_to "more...", "/products/all", :id => "load-more", :remote => true %>
    

    服务器返回纯HTML(这样链接可以在许多不同的页面上使用,并且不绑定到特定的DOM ID)。我们使用 ajax:x 由Rails UJS驱动程序触发的事件(这里我使用jQuery)获取服务器的响应并将其插入页面上的正确元素:

    <%= javascript_tag do %>
      $("#load-more").bind("ajax:complete", function(et, e){
        $("#products-list").html(e.responseText);
      });
    <% end %>
    

    如果需要,我们也可以使用 ajax:loading

    <%= javascript_tag do %>
      $("load-more").bind("ajax:loading", function(et, e){
        $(this).hide();
        $("#products-spinner").show();
      });
    <% end %>
    

    Rails UJS驱动程序还触发了四个其他事件: ajax:success , ajax:failure ajax:before ajax:after . 有关更多信息,请参阅应用程序中包含的驱动程序(public/javascripts/rails.js)。

        2
  •  1
  •   ErsatzRyan    14 年前

    /apps/views/product/index.js.erb

    原型:

    $("products-list").update("<%= escape_javascript(render(@products))%>");
    

    jquery查询:

    $("products-list").html("<%= escape_javascript(render(@products))%>");
    

    $("products-list").append("<%= escape_javascript(render(@products))%>");
    

        3
  •  0
  •   Kyle Gibbons    14 年前

    是的,您可以通过使用 .

    您还可以选择获取json响应,然后使用JS更新页面上的数据。在任何情况下,请记住只呈现部分页面,而不是整个页面。

    编辑:

     $("#more").click(function() {
     // make a POST call and replace the content
        $.post(, function(data) {
          $("#products-list").html(data);
        });
      });
    

    您不需要更多的代码,您可以编写一些帮助程序来生成这个JS,而不是在视图中编写代码。顺便说一句,这还不是UJS