如何使用 App.cable.subscriptions.remove 在 Rails 5 中删除可操作的频道订阅?

Posted

技术标签:

【中文标题】如何使用 App.cable.subscriptions.remove 在 Rails 5 中删除可操作的频道订阅?【英文标题】:How do you remove an actioncable channel subscription in Rails 5 with App.cable.subscriptions.remove? 【发布时间】:2016-05-01 07:21:51 【问题描述】:

创建订阅我运行:

  App.room = App.cable.subscriptions.create(
    channel: "RoomChannel",
    roomId: roomId
  , 
    connected: function() ,
    disconnected: function() ,
    received: function(data) 
      return $('#messages').append(data['message']);
    ,
    speak: function(message, roomId) 
      return this.perform('speak', 
        message: message,
        roomId: roomId
      );
    
  );

但是因为我希望客户端永远不会订阅多个频道,所以在此之前每次我可以运行什么来删除客户端的所有订阅?

我试图做一些超级 hacky 之类的事情:

App.cable.subscriptions['subscriptions'] = [App.cable.subscriptions['subscriptions'][1, 0]]

但我确信它不起作用,因为订阅/取消订阅还有许多其他组件。

App.cable.subscriptions.remove 需要订阅参数,但我应该传入什么?

谢谢!

【问题讨论】:

【参考方案1】:

答案有点晚,但考虑到您已经声明了

App.room = App.cable.subscriptions.create(...)

删除,类似

if (App.room) App.cable.subscriptions.remove(App.room);

应该够了。

【讨论】:

【参考方案2】:

在每个订阅创建之前运行此操作将确保每个客户端最多只能有一个订阅。

if (App.cable.subscriptions['subscriptions'].length > 1) 
    App.cable.subscriptions.remove(App.cable.subscriptions['subscriptions'][1])
;

【讨论】:

【参考方案3】:

您似乎需要在创建时创建对您的订阅的引用

let mySubscription = App.cable.subscriptions.create(
  channel: "MyChannel"
,

  connected: () =>  console.log('connected') ,
  disconnected: () => ,
  received: (data) => 
);

然后像这样删除它

App.cable.subscriptions.remove(mySubscription)

【讨论】:

以上是关于如何使用 App.cable.subscriptions.remove 在 Rails 5 中删除可操作的频道订阅?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

WSARecv 如何使用 lpOverlapped?如何手动发出事件信号?