2015-06-09 14 views
9

निम्न नियंत्रक समस्या के बिना काम करता है।जावास्क्रिप्ट 'बाइंड' विधि अपेक्षित काम नहीं करता

app.controller('foo', ['$scope',function ($scope) { 
     $scope.delete = function(){ 
      bar($scope); 
     } 
    }]); 

मैं bind का उपयोग करके इसे एक छोटे से क्लीनर करने की कोशिश की:

app.controller('foo', ['$scope',function ($scope) { 
     $scope.delete = bar.bind(null, $scope); 
    }]); 

दुर्भाग्य से, इस प्रपत्र की उम्मीद और $scope हमेशा बाध्य विधि में $ गुंजाइश के एक पुराने संस्करण के साथ आपूर्ति की है के रूप में काम नहीं करता है (bar यहां), $ scope के बाद भी एक अलग मूल्य के संदर्भ में बदल गया है। इसमें ग़लत क्या है?

और क्या?

यदि मुझे यहां bind का उपयोग नहीं करना चाहिए, तो विकल्प क्या है?

+0

का उपयोग util के अंदर क्या है के रूप में? मैं नहीं सोच सकता कि आपको ऐसा करने की आवश्यकता क्यों होगी। –

+1

मुझे बांधने का दुरुपयोग लगता है। –

+1

क्या समस्या है कि एक मान * है * 'scope.delete' को आपूर्ति की जा रही है, लेकिन यह एक * पुराना * मान है? या यह कार्य सिर्फ पूरी तरह असफल रहा है (या बिल्कुल मूल्य प्रदान नहीं किया जा रहा है)? – apsillers

उत्तर

10

मुझे लगता है आपकी समस्या यह है कि है कि आपके बाध्य Util.bar हमेशा की तरह, $scope के एक पुराने संस्करण के साथ आपूर्ति की है के बाद भी $scope एक अलग मूल्य का उल्लेख करने के बदल गया है।

bind बाइंड मूल्य, चर नहीं। आप $scope से Util.bar पर वर्तमान मान बाध्यकारी हैं। दूसरी तरफ, आपकी पहली शैली फ़ंक्शन चलाने पर प्रत्येक मान (या, वास्तव में, बाहरी-स्कोप चर रिकॉर्ड) के लिए हल करने के लिए पहचानकर्ता $scope को मजबूर करती है।

यदि $scope एक पूरी तरह से अलग मूल्य के संदर्भ में परिवर्तन करता है, तो आपको पहले फॉर्म का उपयोग करना होगा। .bind(null, $scope)$scope को तत्काल एक मान में हल करेगा और उस मान का हमेशा के लिए उपयोग करेगा, जबकि bind के बिना पहला फॉर्म $scope को हर बार फ़ंक्शन चलाने पर एक मूल्य के लिए हल करेगा।

+0

धन्यवाद, दूसरे कोड के लिए वैकल्पिक विधि क्या है। – PHPst

+0

@PHPst विकल्प वह है जो आप पहले ही उदाहरण में कर रहे हैं। क्या आप यह समझाने के लिए संपादित कर सकते हैं कि यह पर्याप्त क्यों नहीं है? – apsillers

+0

के रूप में @ बाईंस 'में कहा गया है कि $ बिन्द में $ स्कोप हल हो गया है और बाद में कॉल क्लीनर मार्ग में उपयोग किया जाता है, लेकिन पहले भी बाध्य करना चाहते हैं तो इस ऐप कंट्रोलर (' foo ', [' $ scope ', function ($ scope) { $ scope.delete = function() {bar.bind (शून्य, $ स्कोप);} }]); – vinayakj

2

क्या आप सुनिश्चित हैं कि barUtil से कुछ भी उपयोग नहीं करता है? यह करें:

app.controller('foo', ['$scope',function ($scope) { 
    $scope.delete = Util.bar.bind(Util, $scope); 
}]); 
1

जैसा कि उपरोक्त उत्तर में उत्तर दिया गया है, बाध्य विधि का तुरंत असाइनमेंट पर मूल्यांकन किया जा रहा है - इसलिए $ स्कोप का वर्तमान मूल्य बार फ़ंक्शन को पास करने के लिए तर्क के रूप में बाध्य है। जहां तक ​​'क्लीनर' विकल्प है, मुझे नहीं लगता कि आपको कुछ 'क्लीनर' क्यों चाहिए: आप $ scope.delete को ऐसे फ़ंक्शन के रूप में असाइन करना चाहते हैं जो वर्तमान $ स्कोप मान के साथ बार को आमंत्रित करता है, जो आपका वर्तमान कोड करता है एक टी करने के लिए आप अभी भी कुछ के लिए खोज रहे हैं थोड़ा leaner कोड बुद्धिमान तुम हमेशा ES6 वसा तीर वाक्य रचना को अपनाने सकता है (लेकिन आप कोलाहल की तरह एक transpiler आवश्यकता होगी) - तो अपने कोड दिखाई देगा:

app.controller('foo', ['$scope',function ($scope) { 
    $scope.delete =() => bar($scope); 
}]); 
4

इस Plunker पर एक नज़र डालें।

$scope.delete1 = function(){ 
     bar($scope); 
    }; 

    $scope.delete2 = bar.bind(null, $scope); 

    $scope.delete3 = function(){ 
     bar(this); 
    }; 
मेरे लिए

यह एकदम सही ढंग से वास्तव में व्यवहार करने के लिए लगता है: delete1 और delete2 दोनों माता पिता और बच्चे के नियंत्रक पर एक ही बात करने के लिए लग रहे हैं। हटाएं 3 अलग-अलग व्यवहार करते हैं - कारण इस उत्तर में बहुत अच्छी तरह से समझाया गया है: controller's scope

शायद आप निर्दिष्ट कर सकते हैं कि आपको कौन सा व्यवहार (उपयोगकेस) गलत लगता है। वापस जाएं लिंक हैं ताकि आप नियंत्रक पृष्ठ छोड़ सकें और फिर नियंत्रक के नए उदाहरण पर वापस आएं (और एक नया दायरा - जैसा कि आप $ स्कोप से देख सकते हैं। $ आईडी)।

-1

@apsillers कहा, बाँध $ दायरे में हल हो जाता है और बाद में कॉल में इस्तेमाल किया जाता है, तो क्लीनर रास्ता पहले एक, लेकिन अभी भी आप बाँध उपयोग करना चाहते हैं तो

app.controller('foo', ['$scope',function ($scope) { 
    $scope.delete = function(){ 
     bar.bind(null, $scope); 
    } 
}]); 
+0

जब 'हटाएं' कहा जाता है तो यह केवल एक फ़ंक्शन मान बनाता है जिसे फेंक दिया जाता है। –

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