Я написал этот помощник:
export default class EventsHelper {
static triggerNamespacedEvent(eventBus, event, args) {
event.split(':').reduce((previous, current) => {
eventBus.trigger(previous, current);
return `${previous}:${current}`;
});
eventBus.trigger(event, args);
}
}
Чтобы использовать это на ваш взгляд, вы могли бы сделать:
actionOne(argsOne){
EventsHelper.triggerNamespacedEvent(this, 'click:chart:one', argsOne);
}
actionTwo(argsTwo){
EventsHelper.triggerNamespacedEvent(this, 'click:chart:two', argsTwo);
}
Для прослушивания этих событий вы бы do:
//Listen for all clicks
this.listenTo(view, 'click', (args) => {
console.log(`clicked something: ${args}`); //output: clicked something: chart
});
//Listen for all chart clicks
this.listenTo(view, 'click:chart', (args) => {
console.log(`clicked chart: ${args}`); //output: clicked chart: one
});
//Listen for fully qualified event
this.listenTo(view, 'click:chart:two', (args) => {
console.log(`clicked chart two: ${args}`); //output: clicked chart two: evtArgs
});
Это будет работать, но хорошо знать о последствиях производительности: если ваше приложение имеет нетривиальный размер и хорошо использует медиатор («vent»), вероятно, будет ** много ** событий срабатывает. Обработчик 'all' будет видеть много трафика и может привести к фактическому результату. – jevakallio
Интересно ... Я сомневаюсь, что это когда-нибудь вступит в игру на настольном компьютере, но вы правы - мне будет интересно узнать, как он работает в мобильных браузерах? В частности, для телефонов Android до ICS (<4.0) – mikermcneil