我是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对象。我想要的是,每次更改复选框的状态时,都会生成并显示新图表。我可以从我的调试器中看出,确实&lt;%= render_chart(@swChart,'swChart')%&gt;每当复选框的状态发生变化时,都会在视图中调用,但浏览器中的显示永远不会更新。如何在浏览器中显示以显示图表?
修改 我能够通过使用以下方法来控制ajax事件
$('#<%= @row_headers[0].gsub(" ", "-") %>').on('ajax:success', function(event, xhr, settings) {
alert("HERE")
});
出于测试目的,我只是挂了第一个复选框。但是,我不确定如何解析参数,如何获取图表,以及如何将其插回到DOM中。
答案 0 :(得分:0)
假设您正在使用jQuery和jQuery-UJS,您可以使用来自服务器的响应挂钩到AJAX-Callbacks并将dom中的图表替换为:https://github.com/rails/jquery-ujs/wiki/ajax
不幸的是,在guides.rubyonrails.org上没有很好的例子......
答案 1 :(得分:0)
如果你的控制器是RESTful,那么web_pages #manageswgraph可以用单独的视图回答html和ajax(比如administratorswgraph.html.erb和administratorswgraph.js.erb)。
在administratorswgraph.js.erb中放置所有负责替换整个图表的逻辑......我认为它足以放置&lt;%= render_chart(@swChart,'swChart')%&gt;那里,但我不确定。
答案 2 :(得分: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,并且我能够运行它。