2011-10-10 24 views
7

के माध्यम से ईवेंट को ट्रिगर करने वाला तत्व कैसे प्राप्त करें मेरे पास एक दृश्य है।बैकबोन इवेंट हैंडलर

//define View 
var CreatePollView = Backbone.View.extend({ 
    events: { 
     "click #addOption": "addOption", 
     "change .dynamicInput": "changeInputs" 
    }, 
    initialize: function() { 
     _.bindAll(this, "render", "addOption", "changeInputs"); 
     this.model.bind('change', this.render); 
    }, 
    changeInputs: function() { 
     var newVal = $(this).val(); // this throws exception in jquery script 
     this.model.set("Subject", { Subject: newVal }); 
    }, .... 

मैं तत्व को कैसे एक्सेस कर सकता हूं (यह एक इनपुट तत्व है) जिस पर परिवर्तन ईवेंट ट्रिगर किया गया था?

उत्तर

8

आप क्योंकि आप changeInputs पर _.bindAll बुला रहे हैं एक अपवाद हो रही है। जब आप ऐसा करते हैं, तो आप कह रहे हैं कि changeInputs जब भी इसे कॉल किया जाता है तो आपके ऑब्जेक्ट के संदर्भ से बाध्य होगा।

दूसरे शब्दों में, जब आप $(this) पर संदर्भित करते हैं तो आप CreatePollView का jQuery में उदाहरण भेज रहे हैं, जो इसे पसंद नहीं है।

आप, इस बंधन रखना चाहते हैं, क्योंकि आप अपने मॉडल (this.model) तो thisCreatePollView के कहने की जरूरत तक पहुँच रहे हैं।

इसके बजाय, आप अपने कार्य से एक घटना हो और उपयोग कर सकते हैं target या जानकारी के कुछ अन्य टुकड़ा: _.bindAll पर जोड़ा स्पष्टीकरण के लिए

changeInputs: function(e) { } 
+0

+1 वाकई दिलचस्प मैं कभी कभी अभी भी इन बांध के साथ संघर्ष :) – Sander

+2

आपके 'changeInputs' विधि के अंदर, आप विशिष्ट तत्व प्राप्त कर सकते हैं जिसे आपकी आवश्यकताओं के आधार पर' $ (e.currentTarget) 'या' $ (e.target) 'कॉल करके ब्रायन सुझाया गया था। 'e' एक jquery event ऑब्जेक्ट का तर्क देता है, इसलिए diff को समझने के लिए jquery के दस्तावेज़ पर पढ़ें। –

+0

धन्यवाद दोस्तों @ सैंडर। अच्छे खर्च। ऐसा करने के लिए एक उचित तरीका लगता है। इस बीच में मैं इसे काम करने में कामयाब रहा, लेकिन मुझे वास्तव में समझ में नहीं आता कि तर्क संग्रह कहां से आते हैं .... परिवर्तन इनपुट: फ़ंक्शन() { var newVal = arguments [0] .srcElement। मूल्य; this.model.set ("विषय", {विषय: newVal}); }, – Tom

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