私はAngularJSアプリケーションで時計機能を持っています。
$scope.$watch('quartzCrystal', function() {
...
}
しかし、いくつかの条件の後に(私の例では、私のsingle-page applicationでページを変更する)私は(タイムアウトをクリアするなど)その時計を停止したいです。
どうすればいいですか?
私はAngularJSアプリケーションで時計機能を持っています。
$scope.$watch('quartzCrystal', function() {
...
}
しかし、いくつかの条件の後に(私の例では、私のsingle-page applicationでページを変更する)私は(タイムアウトをクリアするなど)その時計を停止したいです。
どうすればいいですか?
:よう
何か。それを呼び出すと$watcher
の登録を解除します。
var listener = $scope.$watch("quartz", function() {});
// ...
listener(); // Would clear the watch
スコープ。$ watchは呼び出し可能な関数を返します。これは時計の登録を解除します。登録解除機能を返す$watch
var unbindWatch = $scope.$watch("myvariable", function() {
//...
});
setTimeout(function() {
unbindWatch();
}, 1000);
[はい、あなたはwatchFn以内にアンバインドすることができますwatchFn –
の範囲内でそれを呼び出すことができるのだろうか!シンプルなユースケース:watchFnを一度しか監視しないで実行してから、ウォッチを停止する必要があります。 –
私はunbind関数を呼び出した後、再度呼び出すように時計を再バインドできますか? –
あなたの$の時計はdynamically
を呼び出しているとあなたが場合にも、コールバック内の時計をクリアすることができ、あなたの$watch
機能
if(myWatchFun)
myWatchFun(); // it will destroy your previous $watch if any exist
myWatchFun = $scope.$watch("abc", function() {});
前に登録解除関数を呼び出す必要がありますので、そのインスタンスを作成しますいくつかの時間何かが起こった直後にそれをクリアしたい。そうすれば、あなたの$ 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!
}
}
と同様に、あなたはこれを使用することができます:あなたはあまりにも多くのウォッチャーを持っていて、それらのすべてをクリアする必要がある場合は
watchers = void 0;
を、それらを配列にプッシュして、ループ内のすべて$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
});
コントローラのライフサイクルの終わりに( '$ on( '$ destroy')'のように)すべてのリスナーを登録解除するか、AngularJSが処理するのがよいかどうか知っていますか?ありがとう! – yorch
スコープが破壊されたときにすべてのウォッチャーが削除されるので、それらを管理する必要はありません。 –
@UmurKontacı - スコープが破棄されたときにウォッチャーが削除されるという主張の原因はありますか? ['$ destroy'関数の一部ではありません](https://github.com/angular/angular.js/blob/cceb455fb167571e26341ded6b595dafd4d92bc6/src/ng/rootScope.js#L693) – jelinson