Skip to content

Instantly share code, notes, and snippets.

@iL53n
Created October 28, 2019 09:23
Show Gist options
  • Save iL53n/b8ed5c55157cac0e10c3e406e0ada77b to your computer and use it in GitHub Desktop.
Save iL53n/b8ed5c55157cac0e10c3e406e0ada77b to your computer and use it in GitHub Desktop.

Revisions

  1. iL53n created this gist Oct 28, 2019.
    55 changes: 55 additions & 0 deletions vue-action-cable.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,55 @@
    module.exports = {
    install: function(Vue, cable) {
    Vue.mixin({
    destroyed: function() {
    if (!this._subscriptions) return
    Object.keys(this._subscriptions).map((key) => {
    this._subscriptions[key].unsubscribe()
    })
    },
    mounted: function() {
    let $vm = this
    // Прочитали подписки опцию из Vue компонента
    let subscriptionsOptions = this.$options.subscriptions
    if (!subscriptionsOptions) return

    // Создали глобальныую переменную для хранения подписок
    this._subscriptions = {}

    // Если опция - функция, вызвали ее
    if (typeof subscriptionsOptions == 'function') subscriptionsOptions = subscriptionsOptions()

    // Цикл по массиву значений (каналов)
    Object.keys(subscriptionsOptions).map(function(channelName) {
    // Получаем содержимое канала ('received')
    let subOptions = subscriptionsOptions[channelName]
    if (!subOptions.params) subOptions.params = {}


    let paramsFn = subOptions.params
    if (typeof paramsFn !== 'function') {
    paramsFn = function() { return subOptions.params }
    }

    let noop = function() {}
    if (!subOptions.received) subOptions.received = noop
    if (!subOptions.connected) subOptions.connected = noop
    if (!subOptions.disconnected) subOptions.disconnected = noop

    $vm.$watch(paramsFn, function(params) {
    if ($vm._subscriptions[channelName]) $vm._subscriptions[channelName].unsubscribe()
    params.channel = channelName

    $vm[channelName] = $vm._subscriptions[channelName] = cable.subscriptions.create(params, {
    received: subOptions.received.bind($vm),
    connected: subOptions.connected.bind($vm),
    disconnected: subOptions.disconnected.bind($vm)
    })
    }, {
    immediate: true
    })
    })
    }
    })
    }
    }