Underscore.js से _.bindAll () फ़ंक्शन के स्पष्टीकरण की आवश्यकता है


85

मैं कुछ backbone.js सीख रहा हूं और मैंने बहुत सारे उदाहरण देखे हैं जहां _.bindAll()इसका उपयोग किया जाता है। मैंने पूरे बैकबोन.js और अंडरस्कोर .js प्रलेखन पृष्ठ के माध्यम से पढ़ा है कि यह क्या करता है की भावना प्राप्त करने की कोशिश करता है, लेकिन मैं अभी भी बहुत फजी हूँ कि यह क्या करता है। यहाँ अंडरस्कोर की व्याख्या है:

_.bindAll(object, [*methodNames]) 

ऑब्जेक्ट पर कई विधियों को बांधता है, MethodNames द्वारा निर्दिष्ट किया जाता है, जब भी वे लागू होते हैं, तो उस ऑब्जेक्ट के संदर्भ में चलाया जाए। बाइंडिंग फ़ंक्शंस के लिए बहुत आसान है जो ईवेंट हैंडलर के रूप में उपयोग होने जा रहे हैं, जो अन्यथा इसे काफी बेकार के साथ लागू किया जाएगा। यदि कोई विधि नाम प्रदान नहीं किया जाता है, तो ऑब्जेक्ट की सभी फ़ंक्शन गुण इसके लिए बाध्य होंगे।

var buttonView = {
  label   : 'underscore',
  onClick : function(){ alert('clicked: ' + this.label); },
  onHover : function(){ console.log('hovering: ' + this.label); }
};

_.bindAll(buttonView);

jQuery('#underscore_button').bind('click', buttonView.onClick);
=> When the button is clicked, this.label will have the correct value...

यदि आप यहाँ एक और उदाहरण शायद या कुछ मौखिक स्पष्टीकरण देकर मदद कर सकते हैं, तो कुछ भी सराहना की जाएगी। मैंने और अधिक ट्यूटोरियल या उदाहरणों की खोज करने की कोशिश की, लेकिन निल की बारी है कि जो मुझे चाहिए उसकी सेवा करें। ज्यादातर लोगों को सिर्फ यह पता लगता है कि यह अपने आप क्या करता है ...


24
शानदार व्याख्या: blog.bigbinary.com/2011/08/18/…
— jared_flack

जवाबों:


67

var Cow = function(name) {
    this.name = name;
}
Cow.prototype.moo = function() {
    document.getElementById('output').innerHTML += this.name + ' moos' + '<br>';
}

var cow1 = new Cow('alice');
var cow2 = new Cow('bob');

cow1.moo(); // alice moos
cow2.moo(); // bob moos

var func = cow1.moo;
func(); // not what you expect since the function is called with this===window
_.bindAll(cow1, 'moo');
func = cow1.moo;
func(); // alice moos
<div id="output" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

दुर्भाग्य से वास्तविक "बाइंड ऑल" कार्यक्षमता केवल ऑब्जेक्ट पर सही कार्य करती है। एक फ़ंक्शन को शामिल करने के लिए जिसे प्रोटोटाइप पर परिभाषित किया गया है, आपको अतिरिक्त फ़ंक्शन के रूप में उन फ़ंक्शन नामों को विस्फोटक रूप से पास करना होगा _.bindAll()।

वैसे भी, आप एक स्पष्टीकरण चाहते थे: मूल रूप से यह आपको किसी फ़ंक्शन पर एक फ़ंक्शन को एक फ़ंक्शन के साथ बदलने की अनुमति देता है जिसमें समान नाम और व्यवहार होता है, लेकिन यह उस ऑब्जेक्ट से भी जुड़ा होता है, इसलिए this === theObjectयहां तक कि इसे विधि ( theObject.method()) के रूप में कॉल किए बिना ।


@ThiefMaster "उन फ़ंक्शन नामों को अन्वेषण करता है जो अतिरिक्त रूप से _.bindAll () के लिए तर्क देते हैं।" क्षमा करें, अभी भी अपने उदाहरण से सीख रहे हैं और इसके प्रभावों का पता लगाने की कोशिश करते हैं: इसलिए आप कहते हैं कि प्रोटोटाइप पर परिभाषित कार्य स्वचालित रूप से _.bindAll के तहत ऑब्जेक्ट के साथ बाध्य नहीं हैं और यदि कोई इसे प्राप्त करने के लिए था, तो एक को खिलाने की जरूरत है। ऑब्जेक्ट के साथ पहला पैरामीटर; यदि फ़ंक्शन फ़ंक्शन प्रोटोटाइप पर परिभाषित किया गया था, तो दूसरा नाम फ़ंक्शन का नाम है?
— निक सो

9
येहुदा काट्ज़ की यह ब्लॉग पोस्टthis जावास्क्रिप्ट में बहुत अच्छी तरह से बताती है।
— हेनरिक एन

9

मेरे लिए सबसे सरल स्पष्टीकरण अगले है:

initialize:function () { //backbone initialize function
    this.model.on("change",this.render); //doesn't work because of the wrong context - in such a way we are searching for a render method in the window object  
    this.model.on("change",this.render,this); //works fine
    //or 
    _.bindAll(this,'render');
    this.model.on("change",this.render); //now works fine
    //after  _.bindAll we can use short callback names in model event bindings
}

-2

इसे इस्तेमाल करे

<input type="button" value="submit" id="underscore_button"/>

<script>
var buttonView = {
    id     : 'underscore',
    onClick: function () {console.log('clicked: ' + this.id)},
    onHover: function () {console.log('hovering: ' + this.id)}
}
_.bindAll(buttonView, 'onClick')
$('#underscore_button').click(buttonView.onClick)
$('#underscore_button').hover(buttonView.onHover)
</script>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.