6

Per creare abbonamenti corro:Come si rimuove un abbonamento al canale Actioncable in Rails 5 con App.cable.subscriptions.remove?

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 
     }); 
    } 
    }); 

Ma perché voglio al cliente di non essere iscritto a più di un canale, quello che posso correre ogni volta prima di questa opzione per rimuovere tutti gli abbonamenti il ​​cliente ha?

ho cercato di fare qualcosa di super hacky simile:

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

ma sono sicuro che non ha funzionato, perché ci sono molti altri componenti che vanno in una sottoscrizione/cancellazione.

App.cable.subscriptions.remove richiede un argomento di sottoscrizione, ma cosa devo passare?

Grazie!

risposta

3

L'esecuzione di questo prima di ogni creazione di abbonamento garantirà che esiste sempre un massimo di una sottoscrizione per client.

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

Sembra che si avrebbe bisogno di creare un riferimento per l'abbonamento a creare

let mySubscription = App.cable.subscriptions.create({ 
    channel: "MyChannel" 
}, 
{ 
    connected:() => { console.log('connected') }, 
    disconnected:() => {}, 
    received: (data) => {} 
}); 

e poi rimuoverlo in questo modo

App.cable.subscriptions.remove(mySubscription) 
6

Un po 'di una risposta in ritardo, ma considerando che hai già dichiarato

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

da rimuovere, qualcosa come

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

dovrebbe essere sufficiente.