私のAngularJSアプリケーションには監視機能があります。
$scope.$watch('quartzCrystal', function () {
...
}
しかし、何らかの条件の後(私の例では、私の 単一ページアプリケーション でページを変更する)、その監視を停止したい(タイムアウトのクリアなど) 。
どうやってやるの?
$watch
は登録解除関数を返します。それを呼び出すと$watcher
の登録が解除されます。
var listener = $scope.$watch("quartz", function () {});
// ...
listener(); // Would clear the watch
scope。$ watchはあなたが呼び出せる関数を返します。
何かのようなもの:
var unbindWatch = $scope.$watch("myvariable", function() {
//...
});
setTimeout(function() {
unbindWatch();
}, 1000);
何かが起こった直後にそれをクリアしたい場合は、コールバック内のウォッチをクリアすることもできます。そのようにしてあなたの$ 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!
}
}
あなたの$ watchがdynamically
を呼び出していて、そのインスタンスを作成することがあるので、$watch
関数の前に登録解除関数を呼び出さなければなりません。
if(myWatchFun)
myWatchFun(); // it will destroy your previous $watch if any exist
myWatchFun = $scope.$watch("abc", function () {});
ウォッチャーが多すぎてそれらをすべてクリアする必要がある場合は、それらを配列にプッシュして、ループ内のすべての$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 = [];
理想的には、スコープを離れると、すべてのカスタムウォッチは削除されるべきです。
それはより良いメモリ管理とより良いアプリパフォーマンスに役立ちます。
// 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
});