Tôi đã viết helper này:
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);
}
}
Để sử dụng này theo quan điểm của bạn, bạn sẽ làm gì:
actionOne(argsOne){
EventsHelper.triggerNamespacedEvent(this, 'click:chart:one', argsOne);
}
actionTwo(argsTwo){
EventsHelper.triggerNamespacedEvent(this, 'click:chart:two', argsTwo);
}
Để nghe cho các sự kiện mà bạn sẽ làm:
//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
});
Điều này sẽ hiệu quả, nhưng bạn nên biết về tác động của hiệu suất: nếu ứng dụng của bạn có kích thước không tầm thường và sử dụng tốt trình trung gian ('vent'), sẽ có nhiều ** sự kiện được kích hoạt. Trình xử lý 'all' sẽ thấy nhiều lưu lượng truy cập và có thể gây ra hiệu suất thực tế. – jevakallio
Thú vị ... Tôi nghi ngờ điều này sẽ bao giờ đi vào chơi trên web máy tính để bàn, nhưng bạn nói đúng - Tôi sẽ tò mò về cách nó đồng hồ trên các trình duyệt di động? Đặc biệt là thiết bị cầm tay Android trước ICS (<4.0) – mikermcneil