ओवरराइट "इस" चर समस्या है या कैसे एक सदस्य समारोह कॉल करने के लिए?

वोट
1

मैं इस वर्ग है, जहां मैं jQuery और का एक संयोजन का उपयोग कर रहा है प्रोटोटाइप :

var MyClass = Class.create({
    initElements: function(sumEl) {
       this.sumEl = sumEl;
       sumEl.keyup(this.updateSumHandler);
    },

    updateSumHandler: function(event) {
       // Throws error here: this.updateSum is not a function
       this.updateSum();
    },

    updateSum: function() {
       // does something here
    }
});

मैं कैसे कॉल कर सकते हैं this.updateSum()सब के बाद?

10/04/2009 को 11:17
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


4 जवाब

वोट
5

आप बंद का उपयोग करने की जरूरत है।

 initElements: function(sumEl) {
        this.sumEl = sumEl;
        var ref = this;
        sumEl.keyup( function(){ref.updateSumHandler();});
 },
10/04/2009 को 11:31
का स्रोत उपयोगकर्ता

वोट
0

यह प्रसिद्ध जावास्क्रिप्ट मुहावरा आप में उपयोग करने की आवश्यकता है initElementsसमारोह:

var that = this;

अपने हैंडलर में बाद में बस का उल्लेख thatबजाय this:

var MyClass = Class.create({
    initElements: function(sumEl) {
        this.sumEl = sumEl;
        var that = this;
        sumEl.keyup(this.updateSumHandler);
    },
    updateSumHandler: function(event) {
        that.updateSum();
    },
    updateSum: function() {
        // does something here
    }
});

यह में विस्तार से कवर किया गया था स्टुअर्ट लैंग्रिज से बात करते हैं पर जावास्क्रिप्ट बंद Fronteers 2008 सम्मेलन में।

10/04/2009 को 11:32
का स्रोत उपयोगकर्ता

वोट
4

पूरी तरह से अपरीक्षित सुझाव:

sumEl.keyup(this.updateSumHandler.bind(this));

.bind()वापस एक नया कार्य जहां के पहले पैरामीटर देता bindसमारोह के रूप में आप के लिए closured है thisसंदर्भ। यह भी बंद मापदंडों की जांच कर सकते प्रलेखन

मेरे लिए, Function.bind()एक सबसे अच्छा समारोह कभी जावास्क्रिप्ट में लिखा है :)

10/04/2009 को 11:35
का स्रोत उपयोगकर्ता

वोट
1

DOMEvent संचालकों पारंपरिक रूप से तत्वों वे करने के लिए संदर्भ के रूप में / "इस" पंजीकृत होने के साथ कहा जाता है। यह वही है jQuery करता है, भी है।

आप के लिए सबसे आसान विकल्प इवेंट डेटा को संभालने के लिए jQuery के क्षमता का उपयोग किया जाएगा

var MyClass = Class.create({
 initElements: function(sumEl) {
        this.sumEl = sumEl;
        sumEl.bind("keyup", this, this.updateSumHandler);
 },

 updateSumHandler: function(event) {
    // event.data is the initial this

    // call updateSum with correct context
    event.data.updateSum.call(event.data);
 },

 updateSum: function() {
        // does something here
 }
});

अन्य संभावना निर्माता अंदर updateHandler परिभाषित करने के लिए बंद का उपयोग करने के लिए है

var MyClass = Class.create({
 initElements: function(sumEl) {
        this.sumEl = sumEl;

        // save this as that so we can access it from the anonymous function
        var that = this;
        sumEl.keyup(function()
        {
           that.updateSum();
        });
 },

 updateSum: function() {
        // does something here
 }
});

यह एक काम कर उदाहरण अन्य उत्तर में से एक करने की कोशिश की क्या है। यह काम करता है गुमनाम समारोह हमेशा आसपास के समारोह में चर का उपयोग कर सकते क्योंकि - लेकिन यह तभी काम करता है समारोह वास्तव में कार्य है कि "है कि" के रूप में स्थानीय चर में परिभाषित किया गया है।

10/04/2009 को 12:30
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more