2011-03-11 14 views
17

मैं बैकबोन.जेएस का उपयोग कर रहा हूं प्रत्येक मॉडल के दृश्य के लिए एक सेगमेंट नियंत्रण-प्रकार UI तत्व है। वे प्रत्येक कुछ तत्वों के साथ उल से बने होते हैं। मैं एक घटना को बांधना चाहता हूं कि जब इन तत्वों में से एक क्लिक किया गया है, तो मैं निर्धारित कर सकता हूं कि कौन सा एक क्लिक किया गया है और उचित मूल्य के साथ मॉडल को अपडेट करें।Backbone.js ईवेंट बाध्यकारी

समस्या यह है कि बैकबोन घटनाओं को बांधता है (ये दृश्यों की घटनाओं में हैश) जैसे कि "यह" कॉलबैक फ़ंक्शन में "तत्व" को संदर्भित करता है, न कि ली तत्व। इसका मतलब है कि मैं यह निर्धारित नहीं कर सकता कि कई ली तत्वों पर क्लिक किया गया है। अगर मैंने सामान्य jQuery बाध्यकारी का उपयोग किया है, तो मैं "तत्व" को ली तत्वों से जोड़ सकता हूं, लेकिन तब मेरे पास मॉडल का ट्रैक नहीं है, इसलिए मैं इसे अपडेट नहीं कर सकता।

उत्तर

44

जो सुविधाजनक होने के लिए this स्थापित करने की jQuery के आदत समय में है एक बहुत बुरा पैटर्न, मेरी राय में - सौभाग्य से, आप उस पर भरोसा करने के लिए की आवश्यकता नहीं है:

onClick: function(e) { 
    this;    // Still the view instance (as it should be). 
    e.target;   // The element that was clicked. 
    e.currentTarget;  // The element that was bound by the click event. 
} 

आप ... इवेंट ऑब्जेक्ट के target या currentTarget का उपयोग कर सकते हैं।

+0

वह, और, यदि आपके दायरे को साफ नहीं किया गया है, तो इंटरनेट एक्सप्लोरर की 'विंडो' को 'विंडो' के रूप में व्याख्या करने की एक ग़लत आदत है। – rxgx

+0

यह केवल jquery- ट्रिगर किए गए ईवेंट के लिए काम करता है, है ना? रीढ़ की हड्डी के ट्रिगर() फ़ंक्शन के माध्यम से ट्रिगर किए गए ईवेंट एक jquery ईवेंट पर नहीं होंगे, बल्कि इसके बजाय आपके द्वारा ट्रिगर में दर्ज तर्क() –

+2

@JensAlm यह सही है। बैकबोन का .trigger() फ़ंक्शन बैकबोन मॉडल पर ईवेंट ट्रिगर करता है, जबकि बैकबोन दृश्य 'ईवेंट' सूची jQuery के प्रतिनिधि एवेन्ट्स पर लगाई जाती है। वे दो अलग-अलग घटना प्रणाली हैं। –

20

पता नहीं लगा सकता कि मैं उपरोक्त @ jashkenas उत्तर पर क्यों टिप्पणी नहीं कर सकता। उनकी विधि सही है (धन्यवाद!) लेकिन मैंने सोचा कि मैं स्थिति को स्पष्ट कर दूंगा: आपके ईवेंट हैंडलर में, आप उस तत्व को पुनर्प्राप्त कर सकते हैं जिस पर ईवेंट बाध्य था। नमूना रीढ़ कोड इस तरह दिखेगा:

MyView = Backbone.View.extend({ 
    events: { 
     'click .item': 'handleClick' 
    }, 

    handleClick: function(e) { 
     this; // The view instance 
     e.target; // The element that was clicked 
     e.currentTarget; // The element that was bound by the click event 
    } 
}); 

मैं अपने प्रपत्र फ़ील्ड्स के सभी में सेटअप डिफ़ॉल्ट पाठ के लिए इसका उपयोग ... हाँ मैं अभी तक एचटीएमएल 5 में ज्यादा नहीं कर रहा हूँ :)

संपादित करें: बीटीडब्ल्यू, e.target कच्चा तत्व है। JQuery पहुंच प्राप्त करने के लिए आपको $ (e.target) का उपयोग करना होगा।

+0

यदि आप रीढ़ की हड्डी का उपयोग कर रहे हैं तो यह तरीका है। – UpTheCreek

+0

अभी भी लंगड़ा लगता है कि आपको यह जानना है कि सीएसएस क्लास को क्या क्लिक किया जा रहा है, उसे जानना है। कुछ '' इसे क्लिक करें। $ El ':' handleClick '' कुछ बेहतर होगा। – bergie3000

+1

यह लंगड़ा नहीं है, क्योंकि आपके ऑब्जेक्ट के दृश्य में मौजूद तत्वों के लिए असाइन किए गए विभिन्न व्यवहार हो सकते हैं (संपादन के लिए पूर्व एक लिंक, हटाने के लिए एक और, आपके आइटम के शीर्षक से सही रखा गया है, यह शीर्षक आपको क्लिक किए जाने पर शो दृश्य में ले जाता है)। या मैं गलत सोच रहा हूँ? – Ben