javascript - 我可以使用 ActionCable 刷新页面吗?
问题描述
我最近一直在尝试为壁球比赛创建一个实时计分系统。我已经设法将 ActionCable 与 Rails 5 一起使用来自动更新页面上的分数,但我想知道如果满足某个条件,是否可以告诉 Rails 刷新页面。
例如,如果游戏已经结束,则会显示一个不同的页面来说明玩家在游戏之间休息。我需要页面完全刷新才能发生这种情况。
在我的数据库中,布尔值“break”在游戏结束时被标记为真,然后视图使用条件 if/else 语句来决定显示什么。
我用来更新分数的代码附在下面,我在想一些类似的东西,if data.break == true
然后页面会自动刷新。
// match_channel.js (app/assets/javascripts/channels/match_channel.js)
$(function() {
$('[data-channel-subscribe="match"]').each(function(index, element) {
var $element = $(element),
match_id = $element.data('match-id')
messageTemplate = $('[data-role="message-template"]');
App.cable.subscriptions.create(
{
channel: "MatchChannel",
match: match_id
},
{
received: function(data) {
var content = messageTemplate.children().clone(true, true);
content.find('[data-role="player_score"]').text(data.player_score);
content.find('[data-role="opponent_score"]').text(data.opponent_score);
content.find('[data-role="server_name"]').text(data.server_name);
content.find('[data-role="side"]').text(data.side);
$element.append(content);
}
}
);
});
});
我不知道这种事情是否可行,而且我不太擅长与 Javascript 相关的任何事情,因此我将不胜感激。
谢谢。
解决方案
重新加载当前页面相对简单。如果您使用的是 Turbolinks,您可以使用它Turbolinks.visit(location.toString())
来触发对当前页面的重新访问。如果您不使用 Turbolinks,请使用location.reload()
. 因此,您的received
函数可能如下所示:
received: function(data) {
if (data.break) {
return location.reload();
// or...
// return Turbolinks.visit(location.toString());
}
// your DOM updates
}
无论哪种方式都相当于用户点击重新加载按钮,因此它会触发另一个 GET,它会调用您的控制器并重新渲染视图。
推荐阅读
- deep-learning - DCGAN的两个问题:数据归一化和fake/real batch
- sql - 合并表,跟踪不匹配
- nginx - 在 GKE 私有集群上创建入口资源时超时
- javascript - 具有函数属性的 Angular 8 中的代码覆盖率问题
- arrays - 如何在 React Native 中对数组进行分组
- spring-boot - Spring boot JMS:当JMS接收器发生内部应用程序错误时如何不丢失jms消息
- javascript - 可以获取我在 Twitter 上屏蔽的人数吗?
- java - 是否可以将异常从 java VBean 传递到 Oracle Forms?
- handlebars.js - 车把逃脱单字符
- codenameone - 代号一中有多个 CSS 文件