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')
4

4 回答 4

9

不会。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"
}); 
于 2013-03-08T14:10:21.550 回答
5

正如在这个答案中提到的,不可能用通配符来监听事件。但正如你所听到的那样,all这将起作用:

vent.on('all', function(evenName, options) {
  var type = evenName.split(/notification:/)[1];
  if (type) {
    console.log(type, options);
  }
});
于 2013-03-08T14:26:41.843 回答
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);
}

要收听这些事件,您将执行以下操作:

//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 
});
于 2017-08-08T11:39:00.323 回答
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"

如果我在 上触发 'session:login_success',则@app只会触发两个特定事件,而不是命名空间之一。

相关github问题:https ://github.com/documentcloud/backbone/issues/2558

于 2013-05-23T16:58:05.240 回答