实时更新数据,无需刷新:a,如何使用Turbolinks clearCache(), b Action Cable
视频:
https://gorails.com/episodes/how-to-use-turbolinks-clearCache?autoplay=1
用途:
更方便的实时从服务器更新局部网页,在这页更新了一条记录的显示方式,
再打开的之前网页的相同位置或相同的功能模块显示也会同步更新。
把Turbolinks.clearCache(),比如放在你写的create.js.erb的第一行。
理解:
原代码写在gem中,它清除了JS behavior of a 302 redirect通过增加一行代码:
第一行是清除
script << "Turbolinks.clearCache()"
第二行是告诉Turbolinks下一步显示什么页面:
script << "Turbolinks.visit(#{location.to_json}, #{visit_options.to_json})"
现在Turbolinks生效了。无论何时一个redirect发送同时请求是一个JS请求,这2行代码会加入的response
提示:
1.如果不加这句话,turbolinks只会reload之前的网页中的数据。并不会取server-side获取新数据。
加上这句话,会强迫浏览器从服务器reload对应的数据,替代trubolinks cash。
2.如果不使用turbolinks,你就得使用HTTP headers for caching, 告诉它必须总是从服务器上reload这个网页。
⚠️:
302 redirect: 302 代表暂时性转移(Temporarily Moved )
301 redirect: 301 代表永久性转移(Permanently Moved)
敏捷rails5.1同步更新的知识点:
rails5有了使用web Sockets的action cable库,更强的实现实时更新。
http://www.cnblogs.com/chentianwei/p/8690304.html
同时,简化了推数据到所有连接的browsers。
比如:
打开了2个浏览器窗口,其中一个窗口的数据显示更新了,另一个窗口无需刷新也会同步更新。
三步走:
1.创建一个频道
2.广播数据
3.接收数据。
例子:建立products的频道:
第一步:
rails g channel products
create app/channels/products_channel.rb
identical app/assets/javascripts/cable.js
create app/assets/javascripts/channels/products.coffee
在开发模式下,Channels有安全机制,默认Rails只允许从localhost存取。如果需要多个技巧同时开发,需要设置:config/environments/development.rb:
config.action_cable.disable_request_forgery_protection = true
然后在app/channels/products_channel.rb中设置,订阅的频道名字是"products"
class ProductsChannel < ApplicationCable::Channel
def subscribed
stream_from "products"
end
def unsubscribed
# Any cleanup needed when channel is unsubscribed
end
end
第二步:广播数据:
在products_controller.rb:
def update
respond_to do |format|
if @product.update(product_params)
format.html { redirect_to @product,
notice: 'Product was successfully updated.' }
format.json { render :show, status: :ok, location: @product }
@products = Product.all
ActionCable.server.broadcast 'products',
html: render_to_string('store/index', layout: false)
else
format.html { render :edit }
format.json { render json: @product.errors,
status: :unprocessable_entity }
end
end
end
因为使用store/index,上面显示了所有products。所以设置了@products实例变量。
'products' 是stream名字
使用,render_to_string(*args), 只会返回一个string。不会设置respond_body。
layout: false,只要view,不要整个page。
Broadcast messages是由Ruby hashes组成的, 会转化为JSON,穿越wire,然后以一个JavaScript object结束。
本案例使用html作为hash key.
这是格式:具体一个格式案例见api文档: ActionCable::Server::Broadcasting
broadcast(broadcasting, message, coder: ActiveSupport::JSON)
broadcasting是一个命名的stream名字。
第三步:在客户端接受数据
涉及订阅频道和定义当数据收到后做什么。
在products.coffee中,生成了一个类,和三个方法:connected, disconnected, received。
本案例关心的是received: 因为他called送到channel的数据。这个数据是一个html属性,由更新的HTML组成。
你可以使用getElementByTagName来定位所有main elements。
received: (data) ->
document.getElementsByTagName("main")[0].innerHTML = data.html
实时更新数据,无需刷新:a,如何使用Turbolinks clearCache(), b Action Cable的更多相关文章
- 数据可视化:Echart中k图实现动态阈值报警及实时更新数据
1 目标 使用Echart的k图展现上下阈值,并且当真实值超过上阈值或低于下阈值时候,标红报警. 2 实现效果 如下:
- 实时更新数据的jQuery图表插件DEMO演示
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Qt之模型/视图(实时更新数据)
上两节简单介绍了Qt中对于模型/视图的编程,大部分助手里说的很清楚了,现在就开始实战部分吧! 在实际应用中,视图展示的数据往往并非一成不变的,那么如何实时更新成了一个很重要的问题!功能:(1)添加委托 ...
- AJAX制作JSON格式的实时更新数据的方法
之前有写过这样的文章,但是出现了几个问题,第一,如果每秒都像数据库发送请求势必会造成服务器的压力过大,第二,如果使用JS的话,是不可以取得系统时间的,因为JS运行在客户端,所以只能取得客户端时间, 如 ...
- 实现DataGridView实时更新数据
;).ToString() + ).ToString() + "秒"; } }}
- IDEA 修改JSP和后端数据后,页面刷新可以实时更新
情况:刚开始使用IDEA进行开发时,发现修改JSP页面或者后端数据后,再刷新浏览器页面,发现没有变化,页面无更新. 这样就导致不得不频繁重启tomcat服务器.非常麻烦 解决方法: 步骤1. 先设置t ...
- MFC编辑框接收数据动态更新与刷新方法代码示例-如何让编辑框内容实时更新
MFC编辑框接收数据动态更新与刷新方法代码示例-如何让编辑框内容实时更新 关键代码: //发送数据通知 //from txwtech@163.com LRESULT CCommSampleDlg::O ...
- Python tkinter库将matplotlib图表显示在GUI窗口上,并实时更新刷新数据
代码 1 ''' 2 使用matplotlib创建图表,并显示在tk窗口 3 ''' 4 import matplotlib.pyplot as plt 5 from matplotlib.pylab ...
- 使用AjaxPro实现无刷新更新数据
需求 在一个页面动态无刷新的更新后台得到的数据.要想无刷新的更新数据,需要使用Javascript能够获取后台返回的数据,然后通过第三方Javascript库(JQuery等)动态更新web页面DOM ...
随机推荐
- 02.MyBatis配置文件详解
MyBatis入参考文档:http://mybatis.org/mybatis-3/zh/ 1.properties 属性 1.在MyBatis配置文件中引用属性文件 MyBatis ...
- Oracle系统结构之修改oracle内存参数
Linux主机16g内存,修改oracle数据库内存参数: 1.编辑/etc/fstab文件:针对tmpfs行将defaults改成defaults,size=12g(千万注意格式,不能出现错误) 修 ...
- Sum It Up---poj1564(dfs)
题目链接:http://poj.org/problem?id=1564 给出m个数,求出和为n的组合方式:并按从大到小的顺序输出: 简单的dfs但是看了代码才会: #include <cstdi ...
- 一道题浅析 i++,++i,i+1及(引用)&i的区别
我们可能很清楚i++,++i和i+1级&i的概念,但在实际运用中我们就有可能很容易搞混淆.特别是在递归中区别它们就显得尤为重要了.那首先我们先看一段利用递归逆序字符串的代码,你能回答出这段代码 ...
- centos shell脚本编程2 if 判断 case判断 shell脚本中的循环 for while shell中的函数 break continue test 命令 第三十六节课
centos shell脚本编程2 if 判断 case判断 shell脚本中的循环 for while shell中的函数 break continue test 命令 ...
- EdrawSoft Edraw Max 9.1安装破解
1,安装软件[不要运行软件] 2,断网 3,打开Crack文件夹,复制”BaseCore.dll”,”ObjectModule.dll”到软件安装目录下替换原文件 默认的安装路径C:\Program ...
- git相关使用技巧和问题
本地有修改和提交,如何强制用远程的库更新更新.我尝试过用git pull -f,总是提示 You have not concluded your merge. (MERGE_HEAD exists). ...
- postman设置环境变量,字段值经过json转换后数值字节长度超过上限的问题
在使用Tests进行环境变量的设置时,遇到这么一种情况,在返回的responseBody中的userId字段,字段返回的是数值类型,再经过json转换之后,发现保存的值跟接口返回的值不一致:如下图: ...
- java对象,引用的区别
一,其实 对象 就是一个类的实例 在Java中有一句比较流行的话,叫做“万物皆对象”,这是Java语言设计之初的理念之一.要理解什么是对象,需要跟类一起结合起来理解.下面这段话引自<Java编程 ...
- python16_day27【crm 内嵌、删除、action】
一.内嵌 二.删除及关联关联显示 三.action