我有一个应用,只要我的Publisher对象有新闻,就需要定期更新屏幕的“新闻”区域。当没有新闻时,屏幕的该区域被隐藏(或者根本不被渲染),并且更新停止。我用Ryan Bates的优秀Polling for Changes RailsCast作为起点,但我坚持了几点。
我的意图是,如果Publisher对象有新闻,则其show()方法会在其上呈现一个<div id='news'></div>
的页面。 Javascript会注意到div并用发布者拥有的任何消息替换它(及其内容),并在5秒后重新触发。当发布者没有更多新闻时,Javascript将用空字符串替换<div id='news'></div>
。在下一次触发时,将不再有<div id='news'></div>
,因此重新触发过程将停止。至少,这是意图。
首先,问题:
简而言之,以下是重要部分:
$(function () {
if ($('#news').length > 0) {
setTimeout(updateNews, 5000);
}
});
function updateNews() {
$.getScript('/publisher/update_news.js');
setTimeout(updateNews, 5000);
}
resource :publisher, :only => [:show] do
member {
get :update_news
}
end
def show
end
def update_news
@publisher = find_publisher
unless (@publisher.has_news?)
return head :ok
end
# otherwise should render views/publisher/update_news.js.html
end
<%= render :partial => 'publishers/show_news',
:locals => {:publisher => @publisher} %>
<% t = escape_javascript(raw(render(:partial => 'publishers/show_news',
:locals => {:publisher => @publisher}))) %>
$('#news').replace_with(' + <%= t %> + ');
<div id='news'>
<h4>latest news</h4>
<%= simple_format publisher.news %>
</div>
Rails.logger.debug消息告诉我,通过show()方法和javascript启动的updateNews()方法调用_show_news.html.erb部分。但我没有看到屏幕上的变化和(可能相关)updateNews函数继续在Publisher.has_news之后被调用?返回false。 (如果jQuery replace_with()函数总是以最初呈现的页面开始,而不是自己修改的结果,则会解释后一个问题。)
所以这两个问题: 1.为什么我看不到屏幕的可见变化?我错误地使用了jquery的替换吗? 我对我停止更新的技术持怀疑态度。什么是正确的方式?