带有通配符的骨干事件

时间:2013-03-08 14:05:14

标签: javascript backbone.js

有没有办法监听命名空间的所有事件。所以当我听这样的事件时:

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 个答案:

答案 0 :(得分: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"
}); 

答案 1 :(得分:5)

正如in this answer所提到的那样,用通配符监听事件是不可能的。但是,你可以听all,这将有效:

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

答案 2 :(得分: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 
});

答案 3 :(得分: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"

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

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

相关问题