如何在Rails中立即和定期执行ajax查询

时间:2014-01-14 21:19:47

标签: javascript jquery ruby-on-rails ajax

在Rails 4中,我有一个类(区域)的索引和显示视图,这些类具有相当复杂的javascript来更新值。对于DRYness,HTML只创建无数据布局,js文件插入数据,修改样式等。这个数据需要每15秒左右更新一次。 common.js.coffee文件包含

root = exports ? this
root.executeQuery = (isAsync = true) ->
  if $('#ajaxParams')? and $('#ajaxParams').data('model')?
  # Use dynamic updates
  update_url = '/' + $('#ajaxParams').data('model')
  if $('#ajaxParams').data('id')?
    update_url += '/' + $('#ajaxParams').data('id')
  update_url += '.js'
  $.ajax({url: update_url, async: isAsync, dataType: "script"}).done (content) ->
    setTimeout ( ->
      executeQuery()
    ), 15000
else
  setTimeout ( ->
    executeQuery()
  ), 15000

处理定期更新。然后zones.js.coffee包含

$(document).ready ->
  executeQuery(false)

因此,在页面就绪时,运行查询,插入动态内容,计划定时器,然后定期更新。到目前为止,这么好,但是当我点击一个带我到区域show方法的链接时,页面是无数据的,直到计时器启动ajax请求。没有页面就绪事件。当我点击一个显示链接返回索引时,会发生同样的事情。

如何让这些视图始终立即更新,或者至少缓存以前的数据,然后进行定期更新?

1 个答案:

答案 0 :(得分:0)

There is no page ready event. The same thing happens when I click on a show link to go back to the index

此问题将由 Turbolinks

引起

Turbolinks基本上会在您的网页上保留<head>标记,并通过ajax加载<body>。虽然它提供了一些性能优势,但它会导致尝试动态加载JS的各种问题。要解决此问题,您需要:Rails 4: how to use $(document).ready() with turbo-links

$(document).ready ->
  executeQuery(false)

应该是:

$(document).ready(executeQuery)
$(document).on('page:load', executeQuery)

您需要将函数封装在变量中,如下所示:

executeQuery = -> 

    (isAsync = true) ->
       if $('#ajaxParams')? and $('#ajaxParams').data('model')?
           # Use dynamic updates
           update_url = '/' + $('#ajaxParams').data('model')
       if $('#ajaxParams').data('id')?
          update_url += '/' + $('#ajaxParams').data('id')
          update_url += '.js'
          $.ajax({url: update_url, async: isAsync, dataType: "script"}).done (content) ->
             setTimeout ( ->
                 executeQuery()
             ), 15000
      else
             setTimeout ( ->
                 executeQuery()
             ), 15000

我认为您必须重命名您的函数名称(我无法从您的问题中收集确切的上下文),因为您似乎是self-referencing