有沒有辦法偵聽名稱空間的所有事件?所以,當我聽到這樣一個事件:帶通配符的主幹事件
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')
有沒有辦法偵聽名稱空間的所有事件?所以,當我聽到這樣一個事件:帶通配符的主幹事件
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')
號骨幹通常觸發一個普通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"
});
正如in this answer提到這是不可能聽帶通配符的事件。但是,正如你可以聽all
這將工作:
vent.on('all', function(evenName, options) {
var type = evenName.split(/notification:/)[1];
if (type) {
console.log(type, options);
}
});
警告:聽了事件命名空間上的自定義事件可能無法正常工作了。例如,這並沒有工作:
@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"
如果我觸發:在@app
「會議login_success」,只有兩個特定事件觸發,而不是命名空間之一。
相關GitHub的問題:https://github.com/documentcloud/backbone/issues/2558
我寫了這個幫手:
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);
}
要監聽這些事件,你會做:
//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」),則可能會發生大量事件觸發。 「全部」處理程序將看到很多流量,並可能導致實際性能下降。 – jevakallio 2013-03-08 15:21:24
有趣...我懷疑這會在桌面網站上發揮作用,但你是對的 - 我會好奇它在移動瀏覽器上的時鐘嗎?特別是Android手機預先ICS(<4.0) – mikermcneil 2013-06-19 10:59:35