13

我正在尝试更新“mydiv”的内容而不刷新整个索引页面。@mydata 由 mycontroller 提供。我需要每隔n秒重新计算一次并将其传递给“mydiv”

使用“link_to”它可以工作!

index.html.erb

<%=
    link_to('refresh', '/mycontroller/index', :remote => true)
%>

<div id="mydiv">
    <%=
        @mydata
    %>
</div>

index.js.erb

$('#mydiv').html('<%= escape_javascript(@mydata) %>')

现在我需要每隔n秒自动刷新“mydiv”的内容(所以不用点击链接)。我尝试了以下解决方案:

但没有运气。

在我的application.js中,我写了这个:

function executeQuery() {
  $.ajax({
    //url: '/index',
    success: function(data) {
      $('#mydiv').html(data)
    }
  });
  setTimeout(executeQuery, 500);
}

$(document).ready(function() {
  setTimeout(executeQuery, 500);
});

对于面临同样问题的人,我通过替换解决了

$('#mydiv').html(data)

$('#mydiv').load('/mycontroller/index #mydiv')
4

2 回答 2

1

使用setInterval()而不是使用setTimeout().

参考: https ://www.w3schools.com/jsref/met_win_setinterval.asp

function executeQuery() {
  $.ajax({
    type: 'GET',
    url: 'example.com/url/', // Provide your response URL here.
    success: function(data) {
      $('#mydiv').html(data);
    }
  });
}

setInterval(executeQuery(), (n * 1000)); // Replace 'n' with how many seconds you want.

此代码将executeQuery()每隔“n”秒间隔运行该方法。这样你的要求就完成了。

于 2019-12-09T09:43:30.213 回答
0

在操作中将布局设置为 false 并仅传递相关内容,而不是整个页面

def action1
   <your code here>
end
def action2
   <your code here>
   render :layout => false
end

您的 action2 视图应包含仅与 #mydiv 相关的内容。

更好的解决方案是使用单个操作并根据请求类型更改渲染选项。(Ajax 或非 ajax)

于 2014-12-01T13:38:00.483 回答