Контакты

Наибольший вклад в теги

Все теги (1)

Лучшие ответы пользователя

Все ответы (1)
  • Можли ли продолжить всплытие собственных событий в vue.js?

    @pal-software
    Начал изучать Vue и буквально сегодня с такой же проблемой столкнулся. Потыкался, почитал, ничего не нашел, в итоге сам запилил такую штуку.. (решение может и не ахти какое, но вроде все работает):
    1. в основной javascript файл в начало вставляем такой код:
    Vue.prototype.$popup_emit = function (event) {
        var vm = this;
        var args = toArray(arguments, 1);
    
        while ( vm && vm != null )
        {
            var cbs    = vm._events[event];
    
            if (cbs) {
                cbs = cbs.length > 1 ? toArray(cbs) : cbs;
    
                for (var i = 0, l = cbs.length; i < l; i++) {
                    try {
                        var result = cbs[i].apply(vm, args);
    
                        // если обработчик вернет false, то сразу останавливаем обработку событий
                        if ( result === false )
                        {
                            return this;
                        }
    
                    } catch (e) {
                        handleError(e, vm, ("event handler for \"" + event + "\""));
                    }
                }
            }
            vm = vm.$parent;
        }
        return this;
    
        function toArray (list, start) {
            start = start || 0;
            var i = list.length - start;
            var ret = new Array(i);
            while (i--) {
              ret[i] = list[i + start];
            }
            return ret
          }
    };

    (по сути это исходник стандартного метода emit с некоторыми моими изменениями)

    2. вместо this.$emit(...) вызываем теперь this.$popup_emit(...) ... это событие будет всплывать от дочерних компонентов к родительским пока не дойдет до самого верха или пока один из обработчиков не вернет false. ...

    ну а дальше можно допиливать на свое усмотрение. ...сильно не тестировал, может какие ошибки, но идея, думаю, понятна..
    Ответ написан
    Комментировать