2015-05-29 2 views

उत्तर

36

Angular.bind एक उपयोगिता समारोह है कि function.bind और partial function application में कार्यक्षमता को जोड़ती है।

बाइंडिंग (सामान्य रूप से) यह विचार है कि आप वर्तमान संदर्भ को किसी फ़ंक्शन पर बाध्य करना चाहते हैं, लेकिन वास्तव में इसे बाद में निष्पादित करना चाहते हैं।

यह जब $http साथ बनाने HTTP कॉल और वादों से निपटने कोणीय में उपयोगी हो सकता है:

$http.get('url').then(angular.bind(this, 
    function(response) { 
     this.response = response; //use this (which is the bound context) 
    }); 

उपरोक्त उदाहरण में, this समारोह के अंदर होगा $http संदर्भ जब तक में this का उल्लेख नहीं हम स्पष्ट रूप से bind इसे। यह एक सामान्य जावास्क्रिप्ट मुद्दा है (कॉलबैक में) संदर्भ के गतिशील बाध्यकारी (जो सबसे लोकप्रिय वर्ग-उन्मुख भाषाओं के विपरीत है) की वजह से है।

आंशिक आवेदन प्रयोग किया जाता है जब आप एक समारोह है कि पहले से ही कुछ अपने तर्कों का पारित किया गया है बनाना चाहते हैं। एक बहुत ही सरल और उदाहरण:

function add(x, y) { 
    return x + y; 
} 

var add10To = angular.bind(this, add, 10); 

console.log(add10To(5)); 
// outputs 15 
Angular.bind साथ

, कोणीय टीम इन एक साथ ऊपर लपेट के दोनों दे रहा है।

+0

मुझे समझा गया कि angular.bind() का उपयोग करने के पहले उदाहरण में "यह" $ http में "यह" का जिक्र कर रहा है लेकिन दूसरे उदाहरण में मुझे समझ में नहीं आया कि यह किस बात का जिक्र कर रहा है (आमतौर पर इसे वैश्विक संदर्भ का संदर्भ लें लेकिन यह उपयोगी नहीं होगा और यह "यह" शायद add10To ऑब्जेक्ट है। क्या आप इसकी पुष्टि कर सकते हैं? – Bardelman

+1

@ बार्डेलमैन बिल्कुल नहीं। पहले 'इस' में, यह '$ http का जिक्र नहीं कर रहा है ', यह फ़ंक्शन स्कोप का जिक्र कर रहा है कि '$ http.get ...' पंक्ति (उदाहरण के लिए, नियंत्रक) के भीतर निहित है। और फिर, दूसरा 'यह' उस संदर्भ का जिक्र कर रहा है जिसमें इन कथन और कार्यों को परिभाषित किया गया है। यदि कोई रैपिंग फ़ंक्शन नहीं है, तो यह वैश्विक संदर्भ को संदर्भित करता है। –

+0

उस स्थिति में, "यह" वैश्विक स्कोप के रूप में क्या होगा जिससे इसे जोड़ने के लिए उपयोगी फ़ंक्शन एनालॉग बनाने के लिए बाध्य किया जा सके। एक्स को 10 के बराबर के रूप में पारित किया गया? – Bardelman

2

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

<body ng-controller="MainCtrl"> 
    <p ng-click="clickMe()">Click me</p> 
</body> 
when clicked the following controller function 

app.controller('MainCtrl', function($scope) { 
    $scope.clickMe = function() { 
    console.log(this === $scope); 
    }; 
}); 
// prints true 

function.bind अक्सर AngularJS नियंत्रक कोड के अंदर नहीं किया जाता है के लिए अंक इस। यहां तक ​​कि लिंक फ़ंक्शन के अंदर परिभाषित फ़ंक्शंस सीधे स्कोप वैरिएबल के साथ काम कर सकते हैं।

संदर्भ: http://bahmutov.calepin.co/why-function-bind-matters-little-in-angularjs.html

7

यह क्लासिक फ़ंक्शंस में से एक है जिस पर कार्यात्मक भाषाएं आधारित हैं। यह हमें आंशिक कार्यों के साथ काम करने की अनुमति देता है। ध्यान दें कि यह कोणीय विशिष्ट नहीं है, यह जावास्क्रिप्ट विशिष्ट है। जावास्क्रिप्ट के लिए अधिकांश उपयोगिता पुस्तकालयों में यह फ़ंक्शन भी शामिल है (उदा। अंडरस्कोर/लोडाश)।

आजकल, यह फ़ंक्शन जावास्क्रिप्ट का एक हिस्सा है (सभी प्रमुख ब्राउज़रों पर समर्थित - Which browsers support bind()? देखें)।

व्याख्या करने के लिए क्या bind करता है, मैं Lodash दस्तावेज में उदाहरण का उल्लेख होगा (कुछ टिप्पणियाँ angular.bind के साथ मूल _.bind की जगह और जोड़ने):

//this is a simple function. Note it uses "this" but it's not inside any object. 
var greet = function (greeting, punctuation) { 
    return greeting + ' ' + this.user + punctuation; 
}; 

//now let's define an object 
var object = { 'user': 'fred' }; 

//now we can create a functions by "binding" the object with the function above and also supplying the "greeting" argument 
var bound = angular.bind(object, greet, 'hi'); 
bound('!'); 
// → 'hi fred!' 
संबंधित मुद्दे