2016-08-16 12 views
5

पर प्रासंगिक बेला तो फिर करने के लिए पारित करने के लिए है। कुछ परिदृश्यों का परीक्षण करने के लिए, मैं करने के लिए संदेश पुश करने के लिए गुंजाइश पर एक सरणी बनाया:

function returnAPromise(valToReturn){ 
    return $q(function(resolve, reject){ 
     $timeout(function(){ 
      resolve(valToReturn); 
     }, 500); 
    }); 
} 

मैं तो एक है:

$scope.messages = []; 

मैं एक समारोह के एक $ q समारोह के रूप में तो रिटर्न कि निर्धारित किया है परिणाम पर .then() कॉल कि इस तरह दिखता है:

returnAPromise('third').then($scope.messages.push); 

जब से मैं केवल मूल्य उस वादे सरणी के साथ हल किया गया था पुश करने के लिए चाहते हैं, तो मुझे लगता है मैं सिर्फ धक्का मुलाकात प्रेषित कर सकता है सोचा संदेशों सरणी के विभागाध्यक्ष, लेकिन जब मुझे लगता है कि, मैं निम्न त्रुटि मिलता है:

VM289 angular.js:12520 TypeError: Array.prototype.push called on null or undefined 
    at processQueue (VM289 angular.js:14792) 
    at VM289 angular.js:14808 
    at Scope.$eval (VM289 angular.js:16052) 
    at Scope.$digest (VM289 angular.js:15870) 
    at Scope.$apply (VM289 angular.js:16160) 
    at VM289 angular.js:17927 
    at completeOutstandingRequest (VM289 angular.js:5552) 
    at VM289 angular.js:5829 

अगर मैं एक समारोह में धक्का लगा है, यह ठीक काम करता है:

returnAPromise('third').then(function(message){ 
    $scope.messages.push(message) 
}); 

यह एक बंद मुद्दा रहा है समझ में नहीं आता?

उत्तर

6

आप के बाद से इसे इस्तेमाल करता है this

returnAPromise('third').then($scope.messages.push.bind($scope.messages)); 
+1

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind उदाहरण अनुभाग मुद्दा और क्यों .bind का वर्णन करता है() यह हल करता है।दुर्भाग्य से, इसमें "नए जावास्क्रिप्ट प्रोग्रामर के लिए एक आम गलती" पंक्ति शामिल है। = [मुझे डिमोट किया गया है। – sonicblis

1

मैं जानता हूँ कि एक स्वीकृत जवाब नहीं है धक्का बाध्य करने के लिए की जरूरत है, लेकिन मैं यह और अधिक स्पष्ट रूप यहाँ

उदाहरण

एक उदाहरण के साथ शुरू कर सकते हैं समझा जाएगा

var scope = { 
    scopeFn: function() { 
    console.log('this', this) 
    } 
} 

function callFn(fn) { 
    fn(); 
} 

callFn(obj.scopeFn) // will log window object 
callFn(function() { 
    obj.scopeFn(); 
});// will log scope object 

जैसा कि आप देख सकते हैं, मज़ाक को लपेटना आयन कॉल किया गया ऑब्जेक्ट इसका मूल्य देगा, लेकिन बिना इसे लपेटे सीधे इसे कॉल करना विंडो ऑब्जेक्ट को कॉल करेगा।

क्यों?

this उस ऑब्जेक्ट से जुड़ जाएगा जिसे इसकी ओर से बुलाया गया है।

पहले उदाहरण में callFn(obj.scopeFn) आप फ़ंक्शन को पैरामीटर के रूप में पास कर रहे हैं, इसलिए जब फ़ंक्शन कहा जाता है, तो इसे सीधे scope ऑब्जेक्ट से नहीं कहा जाता है। (scope ऑब्जेक्ट खो गया है, केवल फ़ंक्शन संदर्भ भेजा गया है)।

दूसरे उदाहरण में आप ऑब्जेक्ट से scopeFn फ़ंक्शन को कॉल कर रहे हैं, इसलिए this इसकी ऑब्जेक्ट से जुड़ जाएगा। (scope वस्तु, नहीं खोया है के रूप में पूरी बात वहाँ जब इसकी भी कहा जाता है)

समाधान

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

var scopeMessage = $scope.messages; 
returnAPromise('third').then(scopeMessage.push.bind(scopeMessage)); 
संबंधित मुद्दे