每n秒刷新一次部分会导致“Stack Level Too Deep”

时间:2014-02-28 10:08:49

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

现在已经坚持了一段时间,我的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>

任何人都可以看到翘起或被误解的内容吗?

非常感谢

2 个答案:

答案 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或类似的浏览器插件进行调试?然后你就会明白为什么它的执行频率超出了你的预期。