2014-01-14 36 views
1

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

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) 

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

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

+1

难道你不能在一个onclick事件吗? 'object.onclick = function(){Ajax request};' – ChrisBarthol

回答

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

+0

这完全解决了我的问题。谢谢!我摆脱了参数和其他条款,因为这只是我的破解试图解决问题。我不太确定你对自我参考的关注。这只是重新调度自己的功能。 – RussK