283

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

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

ただし、何らかの条件(私の例では、シングルページアプリケーションでページを変更する)の後、そのウォッチを停止したいと思います(タイムアウトをクリアするなど)。

どうやってやるの?

4

6 に答える 6

527

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

var listener = $scope.$watch("quartz", function () {});
// ...
listener(); // Would clear the watch
于 2013-02-19T12:37:48.157 に答える
49

scope。$watchは、呼び出すことができ、時計の登録を解除する関数を返します。

何かのようなもの:

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

setTimeout(function() {
    unbindWatch();
}, 1000);
于 2013-02-19T12:37:33.110 に答える
26

何かが起こった直後にウォッチをクリアしたい場合は、コールバック内のウォッチをクリアすることもできます。そうすれば、$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!
  } 
}
于 2015-07-23T20:53:42.923 に答える
4

$ watchが呼び出さdynamicallyれると、インスタンスが作成されるため、関数の前に登録解除関数を呼び出す必要があります$watch

if(myWatchFun)
  myWatchFun(); // it will destroy your previous $watch if any exist
myWatchFun = $scope.$watch("abc", function () {});
于 2015-05-18T10:00:18.893 に答える
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 = [];
于 2016-08-31T13:19:13.420 に答える
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
});
于 2017-09-19T09:03:16.740 に答える