现在已经坚持了一段时间,我的JavaScript非常有限!订购了一本书,但现在我被卡住了。
我正在尝试使用Jquery和AJAX每隔3秒刷新一次我的索引页面上的Partial。
# agents_controller
def refresh_partial
render :partial => "agents/dynamic"
end
#the js
<script type="text/javascript">
$(document).ready(
function() {
setInterval(function() {
$('.dynamic').load('/agents/refresh_partial');
}, 3000);
});
</script>
但我得到的只是
stack level too deep
但没有堆栈跟踪。
我的猜测是无限地调用部分,但我不知道如何或为什么?
有什么建议吗?我是一个非常新的人,但学习速度很快,每本书都有一本书,真的很感谢你们的支持!
从这个问题的答案中拉出来 Reloading partial in an rails app 但它不适合我。
对于完整性:
#/agents/index
<div class="dynamic"><%= render partial: 'dynamic' %></div>
#/agents/_dynamic
<div class="span4">
<table class="table table-striped" >
<% if @ttb.nil? %>
<% else %>
<% @ttb.each_slice(3) do |elem| %>
<tr>
<td><% elem.each_slice(3) do |a,b,c| %></td>
<td><%= a.gsub(/[^0-9A-Za-z]/, '') %></td>
<td><div id="content"><%= b.gsub(/[^0-9A-Za-z]/, '') %></div></td>
<td><%= c.gsub(/[^0-9A-Za-z]/, '').scan(/.{2}|.+/).join(":") %></td>
</tr>
<% end %>
<% end %>
<% end %>
</table>
</div>
任何人都可以看到翘起或被误解的内容吗?
非常感谢
答案 0 :(得分:1)
我过去常常使用ajax,因为你需要刷新 @ttb 。
所以,脚本:
$(document).ready(
function() {
setInterval(function() {
$.ajax({
url: '<%= controller_path(params) %>',
type: 'GET',
data: {},
dataType: 'script',
});
}, 3000);
});
在控制器上:
# agents_controller
def refresh_partial
@ttb = Class.all
respond_to do |format|
format.js
end
end
在查看文件夹上创建一个新文件:refresh_partial.js.erb with:
$('.dynamic').html("<%= escape_javascript('render 'dynamic', ttb: @tb) %>");
这将使用partcial重写div。
其他提示,不要在部分使用@ttb,在调用渲染时发送ttb,就像我做的那样,重新修复部分代码。
答案 1 :(得分:0)
你的JS代码片段是否在'agent / dynamic'部分内部? 如果是这样,该函数在某种程度上是递归执行的,每次加载部分执行一个附加函数也会加载相同的部分(依此类推......)
您应该将JS提取到周围的页面('agent / index')或使用'setTimeout()'方法,而只执行一次。
如果JS已经在索引页面上,则可能重新加载部分也会再次触发$(document).ready。您是否尝试过使用FireBug或类似的浏览器插件进行调试?然后你就会明白为什么它的执行频率超出了你的预期。