Javascript 如何在Angular中解除$on绑定?
我有一段代码在init上使用$scope.$,然后在函数中使用$scope.$,因此代码会执行多次。我怎样才能先解开它,然后再绑。我尝试了$scope.$off,但没有这样的函数,docs.angularjs.org/api没有提到$on。我使用的是angular 1.0.6。Javascript 如何在Angular中解除$on绑定?,javascript,angularjs,javascript-events,Javascript,Angularjs,Javascript Events,我有一段代码在init上使用$scope.$,然后在函数中使用$scope.$,因此代码会执行多次。我怎样才能先解开它,然后再绑。我尝试了$scope.$off,但没有这样的函数,docs.angularjs.org/api没有提到$on。我使用的是angular 1.0.6。$scope.$on返回一个函数,您可以调用该函数来取消注册。如果您不取消注册事件,您将得到内存泄漏,因为传递给$on的函数将不会被清除(因为对它的引用仍然存在)。更重要的是,函数在其作用域中引用的任何变量也将泄漏。如果控
$scope.$on
返回一个函数,您可以调用该函数来取消注册。如果您不取消注册事件,您将得到内存泄漏,因为传递给$on的函数将不会被清除(因为对它的引用仍然存在)。更重要的是,函数在其作用域中引用的任何变量也将泄漏。如果控制器在应用程序中被多次创建/销毁,这将导致函数被多次调用。
幸运的是,AngularJS提供了两种有用的方法来避免内存泄漏和不必要的行为:
- $on方法返回一个函数,可以调用该函数来取消注册事件侦听器
- 每当一个作用域在Angular中被清理(即一个控制器被销毁)时,就会在该作用域上触发一个$destroy事件。您可以注册到$scope的$destroy事件并从中调用cleanUpFunc
angular.module("TestApp")
.controller("TestCtrl",function($scope,$rootScope){
var cleanUpFunc = $scope.$on('testListener', function() {
//write your listener here
});
//code for cleanup
$scope.$on('$destroy', function() {
cleanUpFunc();
};
})
是否在某处记录了可能的副本?但是,这很不舒服,因为如果要在不同的函数中注销事件,需要将注销函数作为参数传递给不同的函数。是否需要为
$destroy
取消注册事件处理程序?@suneetha为什么我不能编写cleanUpFunc=null?