5

बैकबोन में, मैं नया Backbone.listenTo ईवेंट का उपयोग कर रहा हूं। मेरी उदाहरणों में से एक श्रोता तीन अलग-अलग घटनाओं उदा .:Backbone.listen से ट्रिगर किए गए ईवेंट को कैसे ढूंढें?

this.listenTo(this._Collection, 'reset add change', this._setCollection); 

यह उचित रूप से कहा जाता है, जब यह चाहिए था और वहाँ कोई समस्या नहीं है के साथ संलग्न है। मुझे नहीं पता कि यह पता लगाने के लिए कि कौन सी घटना ट्रिगर हुई थी।

_setCollection: function(e) { 
    // Do fun stuff 
} 

समस्या e तर्क केवल संग्रह की एक प्रति भेजता है और क्या घटना वास्तव में शुरू हो रहा है का उल्लेख नहीं है कि है: मैं का उपयोग कर e तर्क की पहुंच है। मैंने e.type और e.target की कोशिश की है लेकिन वे वस्तुएं मौजूद नहीं हैं।

_byCid: Object 
_byId: Object 
_events: Object 
    add: Array[1] 
    change: Array[1] 
    remove: Array[1] 
    reset: Array[1] 
__proto__: Object 
_listenerId: "l16" 
length: 3 
models: Array[3] 

मैं कैसे जान सकता हूँ क्या घटना ट्रिगर किया गया था: यहाँ क्रोम देव उपकरणों से e वस्तु की एक प्रति है?

संपादित करें: उत्तर स्पष्टीकरण: हालांकि उल्लेखनीय जवाब तकनीकी रूप से सही है, के रूप में सही जवाब कई संचालकों उपयोग कर रहा है और "वाक्छल" के इस प्रकार से कार्य नहीं कर mu_is_too_short द्वारा बताया

उत्तर

9

आप घटना प्रकार पता नहीं लगा सकते सीधे लेकिन, कुछ मामलों में, आप इसे arguments से अनुमानित कर सकते हैं। events catalog इस में क्या कहना है:

  • (मॉडल, संग्रह, विकल्प) "जोड़ें" - जब एक मॉडल एक संग्रह करने के लिए जोड़ा गया है।
  • "रीसेट" (संग्रह, विकल्प) - जब संग्रह की पूरी सामग्री बदल दी गई है।
  • "बदलें" (मॉडल, विकल्प) - जब किसी मॉडल के गुण बदल गए हैं।

आप के लिए लकी, उन घटनाओं के सभी तीन विभिन्न मापदंडों है तो arguments की सामग्री को विशिष्ट (इस मामले में) ट्रिगर घटना का निर्धारण करेगा:

  1. तो arguments[0] एक मॉडल और arguments[1] है एक संग्रह है तो आपके पास "add" ईवेंट है।
  2. यदि arguments[0] एक संग्रह है तो आपके पास "reset" ईवेंट है।
  3. यदि arguments[0] एक मॉडल है और arguments.length 2 है तो आपके पास "change" ईवेंट है।

    // M is your model, C is your collection. 
        if(arguments[0] instanceof M 
        && arguments[1] instanceof C) { 
         // An "add" event... 
        } 
        else if(arguments[0] instanceof C) { 
         // A "reset" event... 
        } 
        else if(arguments[0] instanceof M 
         && arguments.length == 2) { 
         // A "change" event... 
        } 
        else { 
         console.log('confusion!'); 
        } 
    

    डेमो:: http://jsfiddle.net/ambiguous/Y9UUX/

    मैं वाक्छल हालांकि इस तरह की सिफारिश नहीं होगा, यह kludgey है, नाजुक

तो आप अपने _setCollection में कुछ अप्रिय और इस तरह कमजोर कर सकते हैं , और यदि आप सूची में अधिक ईवेंट प्रकार जोड़ते हैं तो तोड़ सकते हैं।यदि आपके ईवेंट हैंडलर को यह जानने की जरूरत है कि किस तरह की घटना ने इसे ट्रिगर किया है तो आप प्रत्येक ईवेंट प्रकार के लिए अलग हैंडलर का उपयोग करना बेहतर होगा: तीन फ़ंक्शंस और तीन listenTo कॉल बदसूरत हैकर की एक छोटी ढेर से बेहतर हैं।

+0

हाँ, पूरी तरह से सहमत हैं। मुझे समस्या मिली क्योंकि मैं निकालने की घटना को देख रहा था और इसे सभी को एक समारोह में शामिल कर रहा था। मैंने देखा था कि तर्क अलग थे और इस सवाल में इसे रखना चाहिए था। वैसे भी, आपके हैकरी के लिए धन्यवाद। मैं प्रत्येक के लिए अलग हैंडलर का उपयोग करूँगा। – Brandon

संबंधित मुद्दे