অ্যান্ডস্কোর.জেএস থেকে _.bindAll () ফাংশনের ব্যাখ্যা প্রয়োজন


85

আমি কিছু backbone.js শিখছি এবং আমি _.bindAll()ব্যবহার করা হয় যেখানে প্রচুর দৃষ্টান্ত দেখেছি । এটি কী করে তা বোঝার চেষ্টা করার জন্য আমি পুরো ব্যাকবোন.জেএস এবং আন্ডারস্কোর.জেএস ডকুমেন্টেশন পৃষ্ঠাটি পড়েছি তবে এটি কী করে তা সম্পর্কে এখনও আমি খুব অস্পষ্ট। এখানে আন্ডারস্কোরের ব্যাখ্যা:

_.bindAll(object, [*methodNames]) 

যখনই অনুরোধ করা হয় তখন object অবজেক্টের প্রসঙ্গে চালিত হওয়ার জন্য মেথনাম দ্বারা নির্দিষ্ট করা অবজেক্টে বেশ কয়েকটি পদ্ধতি বেঁধে রাখে। ইভেন্ট হ্যান্ডলার হিসাবে ব্যবহৃত হতে পারে এমন বাধ্যতামূলক ফাংশনগুলির জন্য খুব সহজ, যা অন্যথায় এটিকে মোটামুটি অকেজো দিয়ে ডাকা হবে। যদি কোনও মেথডনম সরবরাহ না করা হয় তবে অবজেক্টের সমস্ত ফাংশন বৈশিষ্ট্য এটির সাথে আবদ্ধ থাকবে।

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()) হিসাবে না ডেকেও ।


@ থিফমাস্টার "অতিরিক্ত যুক্তি হিসাবে _.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>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.