实时更新数据,无需刷新:a,如何使用Turbolinks clearCache(), b Action Cable

https://gorails.com/episodes/how-to-use-turbolinks-clearCache?autoplay=1

用途:

更方便的实时从服务器更新局部网页,在这页更新了一条记录的显示方式,

再打开的之前网页的相同位置或相同的功能模块显示也会同步更新。

把Turbolinks.clearCache(),

Turbolinks.clearCache();

比如放在你写的xx.js.erb的第一行。

如果不加这句话,turbolinks只会reload之前的网页中的数据。并不会取server-side获取新数据。

加上这句话,会强迫浏览器从服务器reload对应的数据,替代trubolinks cash。

如果不使用turbolinks,你就得使用HTTP headers for caching, 告诉它必须总是从服务器上reload这个网页。



敏捷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"

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #ba2da2 }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; min-height: 13.0px }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #008400 }
span.s1 { color: #ba2da2 }
span.s2 { }
span.s3 { color: #d12f1b }
span.s4 { color: #000000 }

class ProductsChannel < ApplicationCable::Channel

def subscribed

stream_from "products"

end

def unsubscribed

# Any cleanup needed when channel is unsubscribed

end

end

第二步:广播数据:

在products_controller.rb:

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #272ad8 }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; min-height: 13.0px }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #ba2da2 }
span.s1 { }
span.s2 { color: #ba2da2 }
span.s3 { color: #000000 }
span.s4 { color: #272ad8 }

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

原文地址:https://www.cnblogs.com/chentianwei/p/9296887.html

时间: 2024-08-28 22:21:04

实时更新数据,无需刷新:a,如何使用Turbolinks clearCache(), b Action Cable的相关文章

Qt之模型/视图(实时更新数据)

上两节简单介绍了Qt中对于模型/视图的编程,大部分助手里说的很清楚了,现在就开始实战部分吧! 在实际应用中,视图展示的数据往往并非一成不变的,那么如何实时更新成了一个很重要的问题!功能:(1)添加委托(进度条)(2)显示文件名称.大小.进度.速度.剩余时间.状态等.(3)可进行添加.更新.删除.清空等操作.(4)实时更新数据先看一个效果图:委托(进度条):ProgressBarDelegate::ProgressBarDelegate(QObject *parent): QItemDelegat

AJAX制作JSON格式的局部实时更新数据的方法

废话不多,上代码,前台: 主要使用了死循环一秒钟读取JS一次去刷新页面(递归的思想)单独对ShowData这个DIV的数据进行刷新 ,个人觉得还是需要优化的.请大神指点 <script type="text/javascript"> $(function () { var i = 0; function setTimeOutPost() { $.ajax({ type: "post", url: "/UserControl/DoData.ash

AJAX制作JSON格式的实时更新数据的方法

之前有写过这样的文章,但是出现了几个问题,第一,如果每秒都像数据库发送请求势必会造成服务器的压力过大,第二,如果使用JS的话,是不可以取得系统时间的,因为JS运行在客户端,所以只能取得客户端时间, 如此的话,就需要在后台计算好时间差,然后前台得到时间差进行倒计时计算,并且更新数据 JS代码如下: var i = 0; var ballNum = ""; var flag = true; var timer_showCountDown = null; var leftTime; func

基于server broker 的数据实时更新

Service Broker介绍:SQL Server Service Broker 为消息和队列应用程序提供 SQL Server 数据库引擎本机支持.这使开发人员可以轻松地创建使用数据库引擎组件在完全不同的数据库之间进行通信的复杂应用程序.开发人员可以使用 Service Broker 轻松生成可靠的分布式应用程序.使用 Service Broker 的应用程序开发人员无需编写复杂的内部通信和消息,即可跨多个数据库分发数据工作负荷.因为 Service Broker 会处理会话上下文中的通信

使用AjaxPro实现无刷新更新数据

需求 在一个页面动态无刷新的更新后台得到的数据.要想无刷新的更新数据,需要使用Javascript能够获取后台返回的数据,然后通过第三方Javascript库(JQuery等)动态更新web页面DOM对应的数值即可,而AjaxPro库恰恰具有使用Javascript语句获取后台方法返回的数据的功能,问题就这样迎刃而解,顿时感觉萌萌哒. 流程 整个过程如下图所示: 详细操作 首先下载AjaxPro库(点击此处下载AjaxPro库),下载后解压得到两个dll文件,如下所示: 其中AjaxPro.2.

WebSocket 实时更新mysql数据到页面

使用websocket的初衷是,要实时更新mysql中的报警信息到web页面显示 没怎么碰过web,代码写的是真烂,不过也算是功能实现了,放在这里也是鞭策自己,web也要多下些功夫 准备 引入依赖 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> <

使用php+swoole对client数据实时更新(二) (转)

上一篇提到了swoole的基本使用,现在通过几行基本的语句来实现比较复杂的逻辑操作: 先说一下业务场景.我们目前的大多数应用都是以服务端+接口+客户端的方式去协调工作的,这样的好处在于不论是处在何种终端的情况下,都可以完美的和服务端兼容.这样就轻松实现了MVC各个部分的真正解耦.但是提高程序的友好性还是有很多路要走,其中一个大家都会遇到的就是数据实时更新的问题.比如一个用户在手机上做了添加操作,这时候其他的终端也应该及时显示数据的变化情况.这个对于手机来说还算好办,因为现在的各种推送服务完全可以

FireFox每次刷新时自动检查网页更新,无需手动清空缓存的设置方法

做技术,经常在写页面的时候需要多次刷新测试,可是浏览器都有自己的 缓存机制,一般CSS和图片都会被缓存在本地,这样我们修改的CSS就看不到效果 了,每次都去清空缓存,再刷新看效果,这样操作太麻烦了.在IE下我们可以直接 去修改internet选项/常规/浏览历史记录/到internet临时文件选项的设置中,将检查网页中的较新版 本改成每次访问此页时检查.这样我们就不用去清空缓存,每次刷新都能看到最新 的网页内容了. 以下内容由BIWEB网站系统创始人ArthurXF倾情奉献,那么在firefox

struts2+jquery 实现ajax无刷新更新数据

前几天为了实现一个struts 的 ajax无刷新更新数据的例子,发现网上资料很少,很多已经过时或者链接都失效了 不过整合他们的资料,加上自己的研究,终于实现了效果 要求:1.各个学院提交学生数据到服务器,要求ajax 无刷新更新数据, 2.服务器端返回"更新成功"的提示窗口: 3.之后,使用jquery 更新input输入框的value值,为实现jquery 打印页面局部数据做准备. 此处使用struts2的第二种方法,(修改struts 配置文件,增加ajax package 的方