2012-02-02 7 views
7

रीढ़ 0.9.0 बदलाव का कहना है:नया बैकबोन व्यू 'इवेंट' हैश संस्करण 0.9.0 में तारों के बजाय फ़ंक्शन मानों के साथ कैसे काम करता है?

एक दृश्य की घटनाओं हैश अब भी अच्छी तरह से मौजूदा दृश्य तरीकों की स्ट्रिंग नामों के रूप में के रूप में प्रत्यक्ष समारोह मूल्यों हो सकती है।

जब मैं निम्नलिखित का प्रयास करता हूं तो यह विफल रहता है, यह कहकर विफल रहता है कि ईवेंट का मान undefined है।

var BB = Backbone.View.extend({ 
    'initialize': function() { 

    this.$el.html('<input type="button" value="Click me!" />'); 
    jQuery('body').html(this.el); 
    }, 

    'events': { 
    'click input[type="button"]': this.buttonClicked 
    }, 

    'buttonClicked': function() { 
    alert('button clicked!'); 
    } 

}); 

window.b = new BB() 

क्या मैं नई सुविधा को गलत समझ रहा हूं? क्या कोई समझा सकता है कि यह अपेक्षा से अलग कैसे काम करता है? शायद यह सिर्फ मेरे जावास्क्रिप्ट वाक्यविन्यास/'इस' के मूल्य परिभाषा समय पर है जो borked है।

तरह से मैं यह अभी भी कर रही करने के लिए इस्तेमाल कर रहा हूँ काम करता है:

'events': { 
    'click input[type="button"]': 'buttonClicked' 
}, 

उत्तर

14

जब जावास्क्रिप्ट पार्सर यहाँ हो जाता है:

'events': { 
    'click input[type="button"]': this.buttonClicked 
}, 

this शायद window है, नहीं BB का एक उदाहरण के रूप में आप उम्मीद । window वस्तु एक buttonClicked संपत्ति नहीं है (कम से कम यह आपके मामले में ऐसा नहीं करता) ताकि आप वास्तव में इस कह रहे हैं:

'events': { 
    'click input[type="button"]': undefined 
}, 

और आपकी त्रुटि है।

आप delegateEvents के लिए स्रोत को देखें, तो आप क्या चैंज का मतलब देखेंगे:। _.isFunction कॉल क्या आप में रुचि रखते हैं है

delegateEvents: function(events) { 
    // ... 
    for (var key in events) { 
    var method = events[key]; 
    if (!_.isFunction(method)) method = this[events[key]]; 
    // ... 
    } 
}, 

कि इसका मतलब है कि आप इस तरह बातें कह सकते हैं:

events: { 
    'click input[type="button"]': function() { alert('pancakes!') }, 
    'click button': some_function_that_is_in_scope 
} 

तो तुम परिभाषित डाल सकते हैं कार्यों (या तो उनके नाम अगर वे सुलभ या के रूप में कार्य कर रहे हैं शाब्दिक द्वारा) events लुकअप तालिका में।

+1

बहुत अच्छा, धन्यवाद। इस बिंदु पर मुझे आश्चर्य की बात यह है कि क्या मैंने प्रत्येक अज्ञात फ़ंक्शन को परिभाषित किया है (जैसे कि 'पैनकेक्स!' आपके उदाहरण में से एक) के पास 'इस' को देखने के लिए इसका मूल्य होगा, या यदि यह लक्ष्य भी होगा घटना है। ऐसा लगता है कि यह लाइन सुनिश्चित करेगी कि यह स्वयं को देखने के लिए तैयार है: विधि = _.bind (विधि, यह); –

+2

@awcrud: रेखा 1078 (और यह उदाहरण: http://jsfiddle.net/ambiguous/JEavM/1/) इंगित करता है कि अज्ञात फ़ंक्शन को दृश्य में रखा जाएगा। –

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