2013-02-19 73 views
259

我在我的AngularJS應用程序中有一個手錶功能。

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

然而,在一些條件(在我的例子,在我single-page application改變頁)我想停止觀看(像清理超時)。

我該怎麼做?

回答

482

$watch返回註銷功能。調用它將取消註冊$watcher

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

您是否知道在控制器生命週期結束時註銷所有監聽器是一種很好的做法(比如''on''''''')或者AngularJS會照顧它們?謝謝! – yorch 2013-10-02 17:36:47

+72

當範圍被銷燬時,所有的觀察者都將被移除,你不需要管理那些 – 2013-10-02 20:03:00

+0

@UmurKontacı - 你是否有一個聲稱的源,當一個範圍被破壞時,觀察者被刪除?它似乎不是['$ destroy'函數]的一部分(https://github.com/angular/angular.js/blob/cceb455fb167571e26341ded6b595dafd4d92bc6/src/ng/rootScope.js#L693) – jelinson 2014-02-16 18:44:43

45

範圍。$ watch返回一個函數,您可以調用並取消註冊手錶。

喜歡的東西:

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

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

不知您是否可以在手錶範圍內調用它Fn – 2014-10-31 22:34:03

+14

是的,您可以在watchFn內解除綁定!簡單的使用案例:您只想觀看並執行一次watchFn,然後停止觀看。 – 2015-01-04 12:30:52

+3

我可以重新綁定手錶後,我稱之爲解除綁定功能,就像再次調用它? – 2015-11-12 11:38:18

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 
});