javascript – Rails Action Cable和Turbolinks:避免多重绑定
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – Rails Action Cable和Turbolinks:避免多重绑定,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2325字,纯文字阅读大概需要4分钟。
内容图文
![javascript – Rails Action Cable和Turbolinks:避免多重绑定](/upload/InfoBanner/zyjiaocheng/767/d92b2bfa07734f91961a833caaa50637.jpg)
我的application.html.haml中有一个代码,用于决定是否将用户订阅到给定的通道,具体取决于某些用户属性.
问题是,鉴于我在身体中有这段代码,当我点击一个链接重定向到另一个页面时,它再次订阅用户而不是保持旧连接,所以我执行了receive()方法多次.
这是我在application.html.haml中的代码:
%html
%head
-# other stuff
= javascript_include_tag 'application', 'data-turbolinks-track': 'reload'
%body
-# other stuff
- if current_user.is_admin?
:coffee
MyApp.AdminNotifications.init()
资产/ Java脚本/通知/ admin_notifications.js.coffee
window.MyApp.AdminNotifications = class AdminNotifications
@init: ->
App.cable.subscriptions.create "ProductsChannel",
received: (data) ->
console.log 'Data Received' # This is being executed multiple times
第一次加载页面时,当我向该频道广播消息时,控制台只记录一次“数据已接收”.
我点击一个链接重定向到另一个页面,我向该频道广播一条新消息,现在控制台正在记录“Data Received”两次.到目前为止……
事实上,当我在chrome的控制台上运行时:
App.cable.subscriptions.subscriptions
它返回对同一频道的多个订阅(每次点击一个链接并重定向到另一个页面时一次).
注意:有更多动作电缆设置,我没有添加到这篇文章,因为它工作正常.
我怎么能避免这种情况?有任何想法吗?
解决方法:
看起来您只需要MyApp.AdminNotifications的单个实例,因此您可能只需要添加一个class属性来标记该类已初始化:
window.MyApp.AdminNotifications = class AdminNotifications
@init: ->
unless @initialized
App.cable.subscriptions.create "ProductsChannel",
received: (data) ->
console.log 'Data Received'
@initialized = true
将来您可能希望包装Action Cable API以管理您自己的订阅.
作为使用Turbolinks时的一般规则,最好在application.js文件中包含尽可能多的内容,而不是在内联脚本中包含(请参阅:https://github.com/rails/rails/pull/23012#issue-125970208).我猜你使用了内联脚本,所以你可以有条件地运行它(如果是current_user.is_admin?).一种流行的方法是使用元标记来传达这些数据,所以在你的头脑中:
<meta name="current-user-is-admin" content="true">
然后你可以:
window.MyApp.User = class User
constructor: ->
@isAdmin = @getMeta('current-user-is-admin') == 'true'
getMeta: (name) ->
meta = document.querySelector("meta[name=#{name}]")
meta.getAttribute('content') if meta
最后,要从布局中删除AdminNotifications init代码,请在application.js中的某处包含:
document.addEventListener('turbolinks:load', ->
window.MyApp.currentUser = new window.MyApp.User
window.MyApp.AdminNotifications.init() if window.MyApp.currentUser.isAdmin
)
希望有所帮助!
内容总结
以上是互联网集市为您收集整理的javascript – Rails Action Cable和Turbolinks:避免多重绑定全部内容,希望文章能够帮你解决javascript – Rails Action Cable和Turbolinks:避免多重绑定所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。