2013-02-19 31 views
259

मेरे एंगुलरजेएस एप्लिकेशन में एक घड़ी का कार्य है।

$scope.$watch('quartzCrystal', function() { 
    ... 
} 

हालांकि, कुछ हालत (मेरे उदाहरण में, मेरे single-page application पर पृष्ठ बदलना) मुझे लगता है कि घड़ी को रोकने के लिए (समय समाप्ति समाशोधन की तरह के रूप में) चाहते हैं के बाद।

मैं यह कैसे कर सकता हूं?

उत्तर

482

$watch एक विपंजीकरण फ़ंक्शन। इसे कॉल करने से $watcher को अपनाना होगा।

var listener = $scope.$watch("quartz", function() {}); 
// ... 
listener(); // Would clear the watch 
+20

क्या आप जानते हैं कि नियंत्रक जीवन चक्र के अंत में आपके सभी श्रोताओं को अपमानित करना एक अच्छा अभ्यास है (जैसे '$ $ (' $ dest ') पर) या AngularJS उनका ख्याल रखेगा? धन्यवाद! – yorch

+72

स्कोप नष्ट होने पर सभी दर्शक हटा दिए जाएंगे, आपको उन –

+0

@ UmurKontacı को प्रबंधित करने की आवश्यकता नहीं है - क्या आपके पास अपने दावे के लिए एक स्रोत है कि जब एक गुंजाइश नष्ट हो जाती है तो दर्शक को हटा दिया जाता है? यह ['$ नष्ट 'फ़ंक्शन का हिस्सा नहीं प्रतीत होता है (https://github.com/angular/angular.js/blob/cceb455fb167571e26341ded6b595dafd4d92bc6/src/ng/rootScope.js#L693) – jelinson

45

गुंजाइश। $ घड़ी एक फ़ंक्शन देता है जिसे आप कॉल कर सकते हैं और वह घड़ी को अनधिकृत कर देगा।

कुछ की तरह:

var unbindWatch = $scope.$watch("myvariable", function() { 
    //... 
}); 

setTimeout(function() { 
    unbindWatch(); 
}, 1000); 
+4

मुझे आश्चर्य है कि अगर आप इसे watchFn –

+14

के दायरे के भीतर कॉल कर सकते हैं हाँ, आप watchFn भीतर निकल पा रहे हैं! सरल उपयोग-केस: आप केवल एक बार watchFn को देखना और निष्पादित करना चाहते हैं, फिर देखना बंद करें। –

+3

क्या मैं अनबंड फ़ंक्शन को कॉल करने के बाद घड़ी को फिर से बांधने में सक्षम हूं, जैसे इसे दोबारा कॉल करना? –

3
कुछ समय

अपने $ घड़ी dynamically बुला रहा है और तो आप अपने $watch समारोह से पहले विपंजीकरण फ़ंक्शन को कॉल करने के लिए है कि वह अपने उदाहरण बना होगा

if(myWatchFun) 
    myWatchFun(); // it will destroy your previous $watch if any exist 
myWatchFun = $scope.$watch("abc", function() {}); 
18

तुम भी कॉलबैक अगर आप अंदर घड़ी साफ कर सकते हैं कुछ होने के बाद इसे साफ़ करना चाहते हैं। इस तरह आपका $ घड़ी उपयोग किए जाने तक सक्रिय रहेगा।

तो जैसा

...

var clearWatch = $scope.$watch('quartzCrystal', function(crystal){ 
    if(isQuartz(crystal)){ 
    // do something special and then stop watching! 
    clearWatch(); 
    }else{ 
    // maybe do something special but keep watching! 
    } 
} 
-10

पर नजर रखने वालों की प्रति को त्यागकर के लिए, आप इस का उपयोग कर सकते हैं:

watchers = void 0; 
2

आप बहुत ज्यादा नजर रखने वालों है और आप उन सभी को स्पष्ट करने के लिए की जरूरत है, आप उन्हें एक सरणी में धक्का दे सकते हैं और लूप में प्रत्येक $watch को नष्ट कर सकते हैं।

var watchers = []; 
watchers.push($scope.$watch('watch-xxx', function(newVal){ 
    //do something 
}));  

for(var i = 0; i < watchers.length; ++i){ 
    if(typeof watchers[i] === 'function'){ 
     watchers[i](); 
    } 
} 

watchers = []; 
0

आदर्श रूप से, जब आप दायरे छोड़ते हैं तो प्रत्येक कस्टम घड़ी को हटा दिया जाना चाहिए।

यह बेहतर मेमोरी प्रबंधन और बेहतर ऐप प्रदर्शन में मदद करता है।

// call to $watch will return a de-register function 
var listener = $scope.$watch(someVariableToWatch, function(....)); 

$scope.$on('$destroy', function() { 
    listener(); // call the de-register function on scope destroy 
});