@ LiviuT का उत्तर भयानक है, लेकिन बहुत सारे लोगों को यह सोचकर छोड़ देता है कि हैंडलर के आंसू-डाउन फ़ंक्शन को एक और $ गुंजाइश या फ़ंक्शन से फिर से कैसे एक्सेस किया जाए, यदि आप इसे उस जगह से अलग करना चाहते हैं जहां इसे बनाया गया था। @ Рустем Мусабеков का जवाब सिर्फ महान काम करता है, लेकिन बहुत मुहावरेदार नहीं है। (और क्या एक निजी कार्यान्वयन विस्तार होना चाहिए पर निर्भर करता है, जो किसी भी समय बदल सकता है।) और वहाँ से, यह बस और अधिक जटिल हो जाता है ...
मुझे लगता है कि यहाँ आसान उत्तर केवल offCallMeFn
हैंडलर में आंसू-डाउन फ़ंक्शन ( उनके उदाहरण में) का संदर्भ लेना है, और फिर इसे कुछ शर्त के आधार पर कॉल करना है; शायद एक arg कि आप इस घटना पर आप $ प्रसारण या $ emit शामिल हैं। हैंडलर इस प्रकार स्वयं को तबाह कर सकते हैं, जब भी आप चाहें, जहां चाहें, अपने स्वयं के विनाश के बीज के आसपास ले जा सकते हैं। इस तरह:
// Creation of our handler:
var tearDownFunc = $rootScope.$on('demo-event', function(event, booleanParam) {
var selfDestruct = tearDownFunc;
if (booleanParam === false) {
console.log('This is the routine handler here. I can do your normal handling-type stuff.')
}
if (booleanParam === true) {
console.log("5... 4... 3... 2... 1...")
selfDestruct();
}
});
// These two functions are purely for demonstration
window.trigger = function(booleanArg) {
$scope.$emit('demo-event', booleanArg);
}
window.check = function() {
// shows us where Angular is stashing our handlers, while they exist
console.log($rootScope.$$listeners['demo-event'])
};
// Interactive Demo:
>> trigger(false);
// "This is the routine handler here. I can do your normal handling-type stuff."
>> check();
// [function] (So, there's a handler registered at this point.)
>> trigger(true);
// "5... 4... 3... 2... 1..."
>> check();
// [null] (No more handler.)
>> trigger(false);
// undefined (He's dead, Jim.)
दो विचार:
- रन-वे हैंडलर के लिए यह एक बेहतरीन फॉर्मूला है। बस सशर्तों को छोड़ दें और
selfDestruct
जैसे ही वह आत्मघाती मिशन पूरा करे, चला जाए ।
- मुझे आश्चर्य है कि क्या मूल गुंजाइश कभी नष्ट हो जाएगी और कचरा एकत्र किया जाएगा, यह देखते हुए कि आप बंद चर का संदर्भ ले रहे हैं। आपको इनमें से एक लाख का उपयोग करना होगा, यहां तक कि यह एक स्मृति समस्या भी हो सकती है, लेकिन मैं उत्सुक हूं। अगर किसी के पास कोई अंतर्दृष्टि है, तो कृपया साझा करें।