কৌণিক জেএস: পরিষ্কার $ ঘড়ি


277

আমার AngularJS অ্যাপ্লিকেশনটিতে আমার একটি ঘড়ির কাজ রয়েছে function

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

যাইহোক, কিছু শর্তের পরে (আমার উদাহরণস্বরূপ, আমার একক পৃষ্ঠা অ্যাপ্লিকেশনটিতে পৃষ্ঠা পরিবর্তন করা ) আমি সেই ঘড়িটি বন্ধ করতে চাই (যেমন ক্লিয়ারিংয়ের সময় সাফ করার মতো)।

আমি এটা কিভাবে করবো?

উত্তর:


520

$watchএকটি নিবন্ধন ফাংশন প্রদান করে। এটি কল করা নিবন্ধন করবে $watcher

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

24
আপনি কি জানেন যে কন্ট্রোলার লাইফসাইকেলের শেষে আপনার সমস্ত শ্রোতাদের নিবন্ধন করা ভাল অভ্যাস (যেমন একটি $on('$destroy')) বা অ্যাঙ্গুলারজেএস সেগুলি যত্ন নেবে? ধন্যবাদ!
ইয়র্চ

81
সুযোগটি নষ্ট হয়ে গেলে সমস্ত
প্রহরীকে

6
আপনি এখানে একটি আকর্ষণীয় আলোচনা দেখতে পাবেন যা এই বিষয়টি ব্যাখ্যা করে: github.com/angular/angular.js/issues/4574 মূলত, আপনি যদি কোনও শ্রোতাকে $ রুটস্কোপের কাছে অর্পণ করেন তবে আপনাকে এটিকে নিজের স্ব-স্বাক্ষর করতে হবে, বা এটি অবিরত থাকবে $ সুযোগ পরিবর্তন। $ স্কোপের প্রহরীরা $ স্কোপ দিয়ে নষ্ট হয়ে যায় (op স্কোপগুলি কৌণিকর মধ্যে একক নয় এবং প্রয়োজনে তারা তৈরি ও ধ্বংস হয়)।
ম্লাদেন ড্যানিক

3
তবে, আমি যদি কেবল মূল্যটি উপস্থিত রয়েছে কিনা তা যাচাই করার জন্য পর্যবেক্ষক চাই এবং তারপরে এটি উপস্থিত থাকে তখন কিছু পরিবর্তন হয় এবং তারপরে আমি নিজেই নিবন্ধন করেছিলাম - var শুনুন = $ স্কোপ $ ) {পরীক্ষা = 1; কনসোল.লগ ("->" + $ স্কোপ.আপডেটইমেল + "-" + পরীক্ষা); শুনুন ();});
হর্ষিত লাধা

4
@ উমুরকন্টাকı আসলে মৃত ব্যক্তির মন্তব্য পুরোপুরি বৈধ কারণ আপনার মূল মন্তব্যটি প্রতিটি ক্ষেত্রেই সঠিক নয়।
GFoley83

49

সুযোগ $ ঘড়ি এমন কোনও ফাংশন দেয় যা আপনি কল করতে পারেন এবং এটি ঘড়িটি নিবন্ধভুক্ত করবে।

কিছুটা এইরকম:

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

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

14
হ্যাঁ, আপনি ওয়াচএফএন-এর মধ্যে আনবাইন্ড করতে সক্ষম! সাধারণ ব্যবহারের ক্ষেত্রে: আপনি কেবল একবার ওয়াচএফএন দেখতে এবং চালাতে চান, তারপরে দেখা বন্ধ করুন।
মাইক রাপাদাস

3
আমি আনবাইন্ড ফাংশনটি কল করার পরে, আবার কল করার মতো, আমি কী আবার ঘড়িটি ফেরত দিতে পারি?
ব্রুনো ফিঙ্গার

এটি দরকারী ছিল। একটি টাইমআউটে আনবাইন্ডওয়াচ করা আমার পরীক্ষায় গুরুত্বপূর্ণ মনে হয়।
eejay

এই ক্ষেত্রে আপনার $ টাইমআউট ব্যবহার করা উচিত, যা আপনি ডি-রেজিস্ট্রেশন করতে পারেন!
বেন টালিডিয়োরোস

সময়সীমা এড়ানোর জন্য সেরা
ডেভি লিমা

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হবে

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 = [];

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.