有没有办法监听命名空间的所有事件。所以当我听这样的事件时:
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')
不会。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"
});
正如在这个答案中提到的,不可能用通配符来监听事件。但正如你所听到的那样,all
这将起作用:
vent.on('all', function(evenName, options) {
var type = evenName.split(/notification:/)[1];
if (type) {
console.log(type, options);
}
});
我写了这个助手:
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
});
警告:监听自定义事件的事件命名空间可能不再起作用。例如,这不起作用:
@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"
如果我在 上触发 'session:login_success',则@app
只会触发两个特定事件,而不是命名空间之一。
相关github问题:https ://github.com/documentcloud/backbone/issues/2558