2013-03-08 4 views
7

Есть ли способ прослушать все события пространства имен. Поэтому, когда я слушаю событие, как это:Магистральные события с подстановочными знаками

app.vent.on('notification(:id)', function(type){console.lof(type)}) 

Он будет слушать все события любит это:

app.vent.trigger('notification:info') 
app.vent.trigger('notification:error') 
app.vent.trigger('notification:success') 

ответ

9

No. Backbone обычно срабатывает общее eventName события, а также eventName:specifier события. Примером этого является Model.change, который позволяет слушать все изменения, а также изменения в отдельных областях:

model.on('change', this.onAnyPropertyChanged); 
model.on('change:name', this.onNamePropertyChanged); 

Следуя этой схеме в вашем коде, вы можете вызвать ваши события следующим образом:

app.vent.trigger('notification', 'info'); 
app.vent.trigger('notification:info'); 

И слушать общий случай:

app.vent.on('notification', function(type){ 
    console.log(type); //-> "info" 
}); 
5

Как упомянуто in this answer не представляется возможным слушать события с групповыми символами. Но, как вы можете слушать all это будет работать:

vent.on('all', function(evenName, options) { 
    var type = evenName.split(/notification:/)[1]; 
    if (type) { 
    console.log(type, options); 
    } 
}); 
+1

Это будет работать, но хорошо знать о последствиях производительности: если ваше приложение имеет нетривиальный размер и хорошо использует медиатор («vent»), вероятно, будет ** много ** событий срабатывает. Обработчик 'all' будет видеть много трафика и может привести к фактическому результату. – jevakallio

+0

Интересно ... Я сомневаюсь, что это когда-нибудь вступит в игру на настольном компьютере, но вы правы - мне будет интересно узнать, как он работает в мобильных браузерах? В частности, для телефонов Android до ICS (<4.0) – mikermcneil

1

Предупреждение: Прослушивание пространств имен событий на пользовательских событий, не может больше работать. Так, например, это делает не работы:

@listenTo @app, 'session', -> console.log ".listenTo `session` triggered" 
    @listenTo @app, 'session:login_success', -> console.log ".listenTo `session:login_success` triggered" 

    @app.on 'session', -> console.log ".on `session` triggered" 
    @app.on 'session:login_success', -> console.log ".on `session:login_success` triggered" 

Если я вызвать «сеанс: login_success» на @app только два конкретных событий огнь, а не имена один.

Связанные вопрос GitHub: https://github.com/documentcloud/backbone/issues/2558

2

Я написал этот помощник:

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 
}); 
Смежные вопросы