2013-02-19 12 views
259

私はAngularJSアプリケーションで時計機能を持っています。

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

しかし、いくつかの条件の後に(私の例では、私のsingle-page applicationでページを変更する)私は(タイムアウトをクリアするなど)その時計を停止したいです。

どうすればいいですか?

答えて

482

:よう

何か。それを呼び出すと$watcherの登録を解除します。

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

コントローラのライフサイクルの終わりに( '$ on( '$ destroy')'のように)すべてのリスナーを登録解除するか、AngularJSが処理するのがよいかどうか知っていますか?ありがとう! – yorch

+72

スコープが破壊されたときにすべてのウォッチャーが削除されるので、それらを管理する必要はありません。 –

+0

@UmurKontacı - スコープが破棄されたときにウォッチャーが削除されるという主張の原因はありますか? ['$ destroy'関数の一部ではありません](https://github.com/angular/angular.js/blob/cceb455fb167571e26341ded6b595dafd4d92bc6/src/ng/rootScope.js#L693) – jelinson

45

スコープ。$ watchは呼び出し可能な関数を返します。これは時計の登録を解除します。登録解除機能を返す$watch

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

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

[はい、あなたはwatchFn以内にアンバインドすることができますwatchFn –

+14

の範囲内でそれを呼び出すことができるのだろうか!シンプルなユースケース:watchFnを一度しか監視しないで実行してから、ウォッチを停止する必要があります。 –

+3

私はunbind関数を呼び出した後、再度呼び出すように時計を再バインドできますか? –

3

あなたの$の時計はdynamicallyを呼び出しているとあなたが場合にも、コールバック内の時計をクリアすることができ、あなたの$watch機能

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

前に登録解除関数を呼び出す必要がありますので、そのインスタンスを作成しますいくつかの時間何かが起こった直後にそれをクリアしたい。そうすれば、あなたの$ 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! 
    } 
} 
-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 
});