AngularJS: स्पष्ट $ घड़ी


277

मैं अपने AngularJS आवेदन में एक घड़ी समारोह है।

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

हालाँकि, कुछ स्थिति के बाद (मेरे उदाहरण में, मेरे एकल-पृष्ठ अनुप्रयोग में पृष्ठ को बदलते हुए ) मैं उस घड़ी को बंद करना चाहता हूं (जैसे समय समाप्त करना)।

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

जवाबों:


520

$watchएक deregistration फ़ंक्शन देता है। इसे कॉलिंग डीरेगिस्टर होगी $watcher

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

24
क्या आपको पता है कि एक नियंत्रक जीवनचक्र (जैसे $on('$destroy')) या एंगुलरजेएस के अंत में अपने सभी श्रोताओं को शांत करने के लिए यह एक अच्छा अभ्यास है ? धन्यवाद!
योरच

81
स्कोप के नष्ट होने पर सभी वॉचर्स को हटा दिया जाएगा, आपको उन का प्रबंधन करने की आवश्यकता नहीं है
उमर कोंटाकी

6
आप यहां एक दिलचस्प चर्चा देख सकते हैं जो इस मामले की व्याख्या करती है: github.com/angular/angular.js/issues/4574 मूल रूप से, यदि आप $ rootScope को श्रोता प्रदान करते हैं, तो आपको इसे अपने आप को अनसाइन करना होगा, या इसके माध्यम से जारी रहेगा $ गुंजाइश बदल जाती है। $ स्कोप पर वॉचर्स $ स्कोप के साथ नष्ट हो जाते हैं ($ स्कोप्स कोणीय में एकल नहीं हैं, और वे आवश्यक रूप से निर्मित और नष्ट हो जाते हैं)।
म्लादेन डैनिक

3
लेकिन, क्या होगा अगर मैं केवल जाँचकर्ता के लिए चाहता हूं कि यदि मान मौजूद है और फिर जब यह मौजूद है तो कुछ परिवर्तन करें और फिर डी रजिस्टर करें मैंने पहले ही कोशिश की - var सुनो = $ गुंजाइश। $ घड़ी ('mvIdentity.currentUser'), function (currentUser) ) {परीक्षण = 1; कंसोल.लॉग ("->" + $ गुंजाइश.अपडेटमेटेल + "-" + परीक्षण); सुनो ();});
हर्षित लड्ढा

4
@ UmurKontacı वास्तव में मृत व्यक्ति की टिप्पणी पूरी तरह से मान्य है क्योंकि आपकी मूल टिप्पणी हर मामले के लिए सही नहीं है।
GFoley83

49

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

कुछ इस तरह:

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

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

14
हां, आप वॉच फ़न में अनबिल कर रहे हैं! सरल उपयोग-मामला: आप वॉच को देखना और निष्पादित करना चाहते हैं केवल एक बार, फिर देखना बंद कर दें।
माइक रैपादास

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

यह उपयोगी था। एक समयबाहर में unbindWatch करना मेरे परीक्षण में महत्वपूर्ण लगता है।
ईजेय

इस मामले में आपको $ टाइमआउट का उपयोग करना चाहिए, जिसे आप डी-रजिस्टर भी कर सकते हैं!
बेन टालिडोरोस

टाइमआउट से बचने के लिए सबसे अच्छा
डेवी लीमा

25

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

इस तरह...

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!
  } 
}

4

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

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

4

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

यह बेहतर मेमोरी मैनेजमेंट और बेहतर ऐप परफॉर्मेंस में मदद करता है।

// 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
});

4

यदि आपके पास बहुत अधिक प्रहरी हैं और आपको उन सभी को साफ़ करने की आवश्यकता है, तो आप उन्हें एक सरणी में धकेल सकते हैं और प्रत्येक $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 = [];

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.