2013-05-23 4 views
61

मैं ट्विटर द्वारा टाइपहेड का उपयोग कर रहा हूं। मैं इंटेलिज से इस चेतावनी में भाग रहा हूं। यह आइटम की मेरी सूची में अंतिम लिंक होने के लिए प्रत्येक लिंक के लिए "window.location.href" का कारण बन रहा है।उत्परिवर्तनीय चर बंद होने से सुलभ है। मैं इसे कैसे ठीक करूं?

मैं अपना कोड कैसे ठीक कर सकता हूं?

AutoSuggest.prototype.config = function() { 
    var me = this; 
    var comp, options; 
    var gotoUrl = "/{0}/{1}"; 
    var imgurl = '<img src="/icon/{0}.gif"/>'; 
    var target; 

    for (var i = 0; i < me.targets.length; i++) { 
     target = me.targets[i]; 
     if ($("#" + target.inputId).length != 0) { 
      options = { 
       source: function (query, process) { // where to get the data 
        process(me.results); 
       }, 

       // set max results to display 
       items: 10, 

       matcher: function (item) { // how to make sure the result select is correct/matching 
        // we check the query against the ticker then the company name 
        comp = me.map[item]; 
        var symbol = comp.s.toLowerCase(); 
        return (this.query.trim().toLowerCase() == symbol.substring(0, 1) || 
         comp.c.toLowerCase().indexOf(this.query.trim().toLowerCase()) != -1); 
       }, 

       highlighter: function (item) { // how to show the data 
        comp = me.map[item]; 
        if (typeof comp === 'undefined') { 
         return "<span>No Match Found.</span>"; 
        } 

        if (comp.t == 0) { 
         imgurl = comp.v; 
        } else if (comp.t == -1) { 
         imgurl = me.format(imgurl, "empty"); 
        } else { 
         imgurl = me.format(imgurl, comp.t); 
        } 

        return "\n<span id='compVenue'>" + imgurl + "</span>" + 
         "\n<span id='compSymbol'><b>" + comp.s + "</b></span>" + 
         "\n<span id='compName'>" + comp.c + "</span>"; 
       }, 

       sorter: function (items) { // sort our results 
        if (items.length == 0) { 
         items.push(Object()); 
        } 

        return items; 
       }, 
// the problem starts here when i start using target inside the functions 
       updater: function (item) { // what to do when item is selected 
        comp = me.map[item]; 
        if (typeof comp === 'undefined') { 
         return this.query; 
        } 

        window.location.href = me.format(gotoUrl, comp.s, target.destination); 

        return item; 
       } 
      }; 

      $("#" + target.inputId).typeahead(options); 

      // lastly, set up the functions for the buttons 
      $("#" + target.buttonId).click(function() { 
       window.location.href = me.format(gotoUrl, $("#" + target.inputId).val(), target.destination); 
      }); 
     } 
    } 
}; 

@ cdhowie की मदद, कुछ और कोड के साथ:

नीचे मेरी कोड है मैं क्लिक के लिए अपडेटर और भी href()

updater: (function (inner_target) { // what to do when item is selected 
    return function (item) { 
     comp = me.map[item]; 
     if (typeof comp === 'undefined') { 
      return this.query; 
     } 

     window.location.href = me.format(gotoUrl, comp.s, inner_target.destination); 
     return item; 
}}(target))}; 
+1

याओ, (सामान्य टिप्पणी से संबंधित नहीं प्रश्न): 'matcher' में वही शामिल नहीं है 'अगर (टाइपऑफ comp ===' अपरिभाषित ') {...} 'सुरक्षा परीक्षण' हाइलाइटर 'और' updater' में शामिल है। कोड पर एक त्वरित नज़र पर, ऐसा लगता है कि यह एक निरीक्षण हो सकता है। –

+0

@ बीटरूट-बीटरूट ओह्ह्ह्ह्ह्ह्ह अच्छा पकड़ !!! धन्यवाद!!! आश्चर्य की बात है कि जब कोई मैच नहीं है तो मुझे कोई त्रुटि नहीं मिली है =/ – iCodeLikeImDrunk

+1

याओ, ऐसा लगता है कि आपके कोड में कहीं और अच्छी त्रुटि सहनशीलता है लेकिन "बेल्ट + ब्रेसेस" किसी को कभी चोट नहीं पहुंचाती है। –

उत्तर

56

आप की जरूरत है अद्यतन करेगा घोंसला दो कार्य यहां, एक नया बंद करने वाला है जो बंद होने के समय वैरिएबल के मूल्य (चर के बजाय) को कैप्चर करता है। आप इसे त्वरित रूप से आवंटित बाहरी फ़ंक्शन पर तर्कों का उपयोग करके कर सकते हैं।

function (item) { // what to do when item is selected 
    comp = me.map[item]; 
    if (typeof comp === 'undefined') { 
     return this.query; 
    } 

    window.location.href = me.format(gotoUrl, comp.s, target.destination); 

    return item; 
} 
इस के साथ

: इस अभिव्यक्ति की जगह

(function (inner_target) { 
    return function (item) { // what to do when item is selected 
     comp = me.map[item]; 
     if (typeof comp === 'undefined') { 
      return this.query; 
     } 

     window.location.href = me.format(gotoUrl, comp.s, inner_target.destination); 

     return item; 
    } 
}(target)) 

ध्यान दें कि हम बाहरी समारोह है, जो तर्क inner_target हो जाता है में target गुजरती हैं, प्रभावी रूप से इस समय target का मूल्य पर कब्जा बाहरी समारोह है बुलाया। बाहरी फ़ंक्शन एक आंतरिक फ़ंक्शन देता है, जो के बजाय inner_target का उपयोग करता है, और inner_target नहीं बदलेगा।

(ध्यान दें कि आप target को inner_target नाम बदल सकते हैं और आप ठीक हो जाएगा - निकटतम target उपयोग किया जाएगा, जो समारोह पैरामीटर होगा हालांकि, इस तरह के एक तंग दायरे में ही नाम के दो चर होने हो सकता है। बहुत भ्रामक है और इसलिए मैं उन्हें अलग तरह से मेरे उदाहरण में नामित किया है ताकि आप देख सकते हैं क्या हो रहा है।)

+0

दूसरे भाग के बारे में क्या? जहां मैंने बटन के लिए href सेट किया है? चीजों को करने का यह तरीका मेरे लिए बहुत अजीब लगता है =/ – iCodeLikeImDrunk

+2

@yaojiang वहां एक ही तकनीक लागू करें। अगर आपको मदद की ज़रूरत है तो मुझे बताएं और हम बातचीत में जा सकते हैं। लेकिन पहले यह समझने की कोशिश करें कि मेरे उदाहरण में क्या हो रहा है, और इसे स्वयं करने का प्रयास करें। (यदि आप इसे स्वयं करते हैं तो अवधारणा बेहतर रहेगी!) – cdhowie

+0

मैं जल्द ही अपने कोड के साथ अपडेट करूंगा। – iCodeLikeImDrunk

124

मैं से Javascript Garden

पैरा क्लोजर अंदर लूप्स पसंद आया यह कर के तीन तरीके बताते हैं ।

गुमनाम आवरण के साथ

for(var i = 0; i < 10; i++) { 
    setTimeout(function() { 
     console.log(i); 
    }, 1000); 
} 

समाधान 1 एक पाश के अंदर बंद करने का उपयोग करने का गलत तरीके से

for(var i = 0; i < 10; i++) { 
    (function(e) { 
     setTimeout(function() { 
      console.log(e); 
     }, 1000); 
    })(i); 
} 

समाधान 2 - एक बंद होने से एक समारोह लौटने

for(var i = 0; i < 10; i++) { 
    setTimeout((function(e) { 
     return function() { 
      console.log(e); 
     } 
    })(i), 1000) 
} 

समाधान 3, मेरा पसंदीदा, जहां मुझे लगता है कि मैं अंततः bind - यानी समझ गया! एफटीडब्ल्यू बांधो!

for(var i = 0; i < 10; i++) { 
    setTimeout(console.log.bind(console, i), 1000); 
} 

मैं अत्यधिक Javascript garden की सलाह देते हैं - यह मुझे इस और कई और अधिक जावास्क्रिप्ट quirks से पता चला है (और मुझे जे एस की तरह और भी बनाया)।

पेज। अगर आपका मस्तिष्क पिघल गया नहीं है तो उस दिन आपके पास पर्याप्त जावास्क्रिप्ट नहीं था।

1

के बाद से केवल scoping जावास्क्रिप्ट है कि समारोह गुंजाइश है, तो आप बस बंद करने के लिए एक बाहरी कार्य करने के लिए, ले जा सकते हैं गुंजाइश आप में हैं के बाहर।

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