2013-03-08 16 views
7

Czy istnieje sposób na odsłuchiwanie wszystkich zdarzeń w przestrzeni nazw. kiedy tak słucham zdarzenie tak:Zdarzenia szkieletowe ze znakami wieloznacznymi

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

Będzie słuchać wszystkich zdarzeń lubi to:

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

Odpowiedz

9

nr Backbone zazwyczaj odpala ogólny eventName zdarzenia, jak również eventName:specifier wydarzenie. Przykładem tego jest Model.change, który pozwala na słuchanie wszystkich zmian, jak również zmian w poszczególnych dziedzinach:

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

naśladujących tego wzorca w kodzie, można wywołać wydarzenia następująco:

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

i słuchać ogólnym przypadku:

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

Jak wspomniano przez in this answer nie jest możliwe, aby słuchać wydarzenia z symboli wieloznacznych. Ale jak można słuchać all to będzie działać:

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

To zadziała, ale dobrze jest mieć świadomość reperkusji wydajności: jeśli twoja aplikacja ma nietrywialny rozmiar i dobrze wykorzystuje mediatora ('vent'), prawdopodobnie będzie ** wiele ** wydarzeń rozsierdzony. Operator 'all' zobaczy duży ruch i może spowodować rzeczywiste trafienie wydajności. – jevakallio

+0

Interesujące ... Wątpię, czy kiedykolwiek miałoby to miejsce w Internecie, ale masz rację - chciałbym być ciekawy, jak to się dzieje w przeglądarkach mobilnych? Szczególnie telefony z Androidem pre-ICS (<4.0) – mikermcneil

1

Ostrzeżenie: Słuchanie nazw zdarzeń na niestandardowych zdarzeń nie może pracować dłużej. Na przykład, to nie robi pracy:

@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" 

Gdybym wyzwalać „sesja: login_success” na @app, tylko ogień dwa szczególne wydarzenia, a nie nazw jeden.

Powiązane problem github: https://github.com/documentcloud/backbone/issues/2558

2

Pisałem ten pomocnika:

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); 
    } 
} 

Aby to wykorzystać w swojej widzenia byłoby zrobić:

actionOne(argsOne){ 
    EventsHelper.triggerNamespacedEvent(this, 'click:chart:one', argsOne); 
} 

actionTwo(argsTwo){ 
    EventsHelper.triggerNamespacedEvent(this, 'click:chart:two', argsTwo); 
} 

aby wysłuchać tych wydarzeń byś 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 
}); 
Powiązane problemy