web-dev-qa-db-ja.com

AngularJS:$ウォッチをクリア

私のAngularJSアプリケーションには監視機能があります。

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

しかし、何らかの条件の後(私の例では、私の 単一ページアプリケーション でページを変更する)、その監視を停止したい(タイムアウトのクリアなど) 。

どうやってやるの?

274
kamaci

$watchは登録解除関数を返します。それを呼び出すと$watcherの登録が解除されます。

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

scope。$ watchはあなたが呼び出せる関数を返します。

何かのようなもの:

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

setTimeout(function() {
    unbindWatch();
}, 1000);
45
Anders Ekdahl

何かが起こった直後にそれをクリアしたい場合は、コールバック内のウォッチをクリアすることもできます。そのようにしてあなたの$ watchは使われるまでアクティブになります。

そのようです...

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

あなたの$ watchがdynamicallyを呼び出していて、そのインスタンスを作成することがあるので、$watch関数の前に登録解除関数を呼び出さなければなりません。

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

ウォッチャーが多すぎてそれらをすべてクリアする必要がある場合は、それらを配列にプッシュして、ループ内のすべての$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 = [];
4
Rewar

理想的には、スコープを離れると、すべてのカスタムウォッチは削除されるべきです。

それはより良いメモリ管理とより良いアプリパフォーマンスに役立ちます。

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