2013-03-08 7 views
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') 

उत्तर

9

सं बैकबोन आम तौर पर एक सामान्य 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" 
}); 
5

in this answer ने उल्लेख किया है कि यह वाइल्डकार्ड के साथ घटनाओं सुनने के लिए संभव नहीं है। लेकिन जैसा कि आप all को सुन सकते हैं इस काम करेगा:

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

यह काम करेगा, लेकिन प्रदर्शन के प्रदर्शन से अवगत होना अच्छा है: यदि आपका आवेदन गैर-तुच्छ आकार का है और मध्यस्थ ('वेंट') का अच्छा उपयोग करता है, तो घटनाओं की ** ** ** की संभावना होगी शुरू हो गया। 'सभी' हैंडलर बहुत सारे ट्रैफिक देखेंगे, और वास्तविक प्रदर्शन हिट का कारण बन सकता है। – jevakallio

+0

दिलचस्प ... मुझे संदेह है कि यह डेस्कटॉप वेब पर कभी भी खेलेंगे, लेकिन आप सही हैं - मैं उत्सुक होगा कि यह मोबाइल ब्राउज़र पर कैसे घूमता है? विशेष रूप से एंड्रॉइड हैंडसेट प्री-आईसीएस (<4.0) – mikermcneil

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 पर 'सत्र login_success', केवल दो विशिष्ट घटनाओं आग, नहीं नाम स्थान एक।

संबंधित GitHub मुद्दा:

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

अपने ध्यान में रखते हुए इस का उपयोग करने के लिए आप क्या करना होगा: https://github.com/documentcloud/backbone/issues/2558

2

मैं इस सहायक लिखा है

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 
}); 
संबंधित मुद्दे