Начал изучать 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. ...
ну а дальше можно допиливать на свое усмотрение. ...сильно не тестировал, может какие ошибки, но идея, думаю, понятна..