1

我是 Rails 的新手,所以我不确定这是否是正确的方法。我有一个视图,其中包含多个复选框的 AJAX 链接,形式为

<% @row_headers.each do |row_header| %>
  <% row_header_ = row_header.gsub(" ", "-") %>
    <%= check_box_tag row_header_, row_header, params.key?(row_header_),
      :data => { :remote => true,
      :url => url_for(
        controller: :web_pages,
        action: :administratorswgraph} %> <%= row_header %>
 <% end %>
<% end %>

这是从 :administratorswgraph 视图调用的。稍后在我的文件中

<% if not @swChart.nil? %>
  <div id="swChart"></div>
  <%= render_chart(@swChart, 'swChart') %>
<% end %>

其中 render_chart 来自GoogleVisualr库。在我有的控制器上

def administratorswgraph
  headers = []
  @row_headers.each_with_index do |row_header, i|
    if params.key? row_header.gsub(" ", "-")
      headers.push i
    end
  end
  if headers.empty?
    @swChart = nil
  else
    @swChart = MakeSiteChart(headers, 580, 480)
  end
end

MakeSiteChart 函数根据复选框返回一个 GoogleVisualr 对象。我想要的是,每次更改复选框的状态时,都会制作并显示一个新图表。我可以从我的调试器中看出,只要复选框的状态发生更改,确实会在视图中调用 <%= render_chart(@swChart, 'swChart') %>,但是浏览器中的显示永远不会更新。如何在浏览器中显示图表?

编辑 我能够通过使用以下方法来控制 ajax 事件

$('#<%=  @row_headers[0].gsub(" ", "-") %>').on('ajax:success', function(event, xhr, settings) {
  alert("HERE")

});

出于测试目的,我只连接第一个复选框。但是,我不确定如何解析参数、如何获取图表以及如何将其重新插入 DOM。

4

3 回答 3

0

如果您的控制器是 RESTful 的,那么 web_pages#administratorswgraph 可以使用单独的视图(例如 administratorswgraph.html.erb 和 administratorswgraph.js.erb)响应 html 和 ajax。

将所有负责替换整个图表的逻辑放在 administratorswgraph.js.erb 中...我认为足以将 <%= render_chart(@swChart, 'swChart') %> 放在那里,但我不确定。

于 2012-10-24T17:04:38.980 回答
0

在搞砸了很多之后,我能够想出一个令人满意的解决方案。我在视图中使用了以下 JavaScript

<script type="text/javascript" charset="utf-8" id ="myScript">
  <% @row_headers.each do |row_header| %>
    $('#<%= row_header.gsub(" ", "-") %>').bind('ajax:success', function(event, data, status, xhr) {
      var scripts = $(data).filter('script')
      var chartScript;
      scripts.each(function(index, Element){
        if (Element.text.indexOf("swChart") != -1 && Element.id != "myScript") {
          chartScript = Element.text;
        }
      });
      jQuery.globalEval(chartScript)
    });
  <% end %>
</script>

这使我能够在 ajax 请求返回后提取需要运行的 JavaScript,并且我能够运行它。

于 2012-10-24T20:55:33.657 回答
0

假设您使用的是 jQuery 和 jQuery-UJS,您可以连接到 AJAX-Callbacks 并将您的 dom 中的图表替换为来自服务器的响应:https ://github.com/rails/jquery-ujs/维基/阿贾克斯

不幸的是,在guides.rubyonrails.org上没有很好的例子......

于 2012-10-24T15:20:06.030 回答