All files / src/components/m-pub-sub.vue index.vue

16.27% Statements 7/43
5% Branches 1/20
0% Functions 0/14
19.44% Lines 7/36

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86      7x   7x     7x           7x                                                                                                               7x                              
<script>
import pubsub from './pubsub';
 
export const MPublisher = {
    created() {
        const pubs = this.$options.publish;
        if (!pubs)
            return;
        Object.keys(pubs).forEach((topic) => {
            let pub = pubs[topic];
            if (typeof pub === 'string' || typeof pub === 'function')
                pub = { expOrFn: pub };
 
            this.$watch(pub.expOrFn, (value) => {
                pubsub.publish(topic, value);
            }, { deep: pub.deep, immediate: pub.immediate });
        });
    },
    beforeDestroy() {
        const pubs = this.$options.publish;
        if (!pubs)
            return;
        Object.keys(pubs).forEach((topic) => {
            pubsub.unpublish(topic);
        });
    },
    methods: {
        $publish(topic, ...args) {
            return pubsub.publish(topic, ...args);
        },
        $unpublish(topic) {
            return pubsub.unpublish(topic);
        },
    },
};

export const MSubscriber = {
    created() {
        const subs = this.$options.subscribe;
        if (!subs)
            return;
        this.$options.subscriptions = {};
        Object.keys(subs).forEach((topic) => {
            let sub = subs[topic];
            if (typeof sub === 'function')
                sub = { handler: sub.bind(this) };
            else if (typeof sub === 'string')
                sub = { handler: this[sub] };
            else
                sub.handler = sub.handler.bind(this);
 
            let handler;
            if (sub.once) {
                handler = () => {
                    pubsub.unsubscribe(topic, handler);
                    return sub.handler();
                };
            } else
                handler = sub.handler;
 
            this.$options.subscriptions[topic] = handler;
 
            pubsub.subscribe(topic, handler);
        });
    },
    beforeDestroy() {
        const subs = this.$options.subscribe;
        if (!subs)
            return;
        Object.keys(subs).forEach((topic) => {
            pubsub.unsubscribe(topic, this.$options.subscriptions[topic]);
        });
    },
    methods: {
        $subscribe(topic, func) {
            return pubsub.subscribe(topic, func);
        },
        $unsubscribe(topic, func) {
            return pubsub.unsubscribe(topic, func);
        },
    },
};
 
export default { mixins: [MSubscriber, MPublisher] };
</script>