Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Angular中解除$on绑定?_Javascript_Angularjs_Javascript Events - Fatal编程技术网

Javascript 如何在Angular中解除$on绑定?

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的函数将不会被清除(因为对它的引用仍然存在)。更重要的是,函数在其作用域中引用的任何变量也将泄漏。如果控

我有一段代码在init上使用$scope.$,然后在函数中使用$scope.$,因此代码会执行多次。我怎样才能先解开它,然后再绑。我尝试了$scope.$off,但没有这样的函数,docs.angularjs.org/api没有提到$on。我使用的是angular 1.0.6。

$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?