当前位置: 首页 > 面试题库 >

如何在AngularJS中向rootscope注销广播事件?

路雅懿
2023-03-14
问题内容

我有以下几点:

angular.module('test')
    .controller('QuestionsStatusController1',
    ['$rootScope', '$scope', '$resource', '$state',
    function ($rootScope, $scope, $resource, $state) {

        $scope.action2 = function() {
            $rootScope.$broadcast('action2@QuestionStatusController1');
        }

    }]);

angular.module('test')
   .controller('QuestionsStatusController2',
   ['$rootScope', '$scope', '$resource', '$state',
   function ($rootScope, $scope, $resource, $state) {

    $rootScope.$on('action2@QuestionStatusController1', function {
         //write your listener here
    })

   }]);

据我了解,我需要取消注册监听事件。有人可以告诉我如何编码/执行此操作吗?


问题答案:

如果您不取消注册该事件,则将发生内存泄漏,因为传递给您的函数$on将不会被清除(因为对该函数的引用仍然存在)。更重要的是,在其范围内引用函数的任何变量也将泄漏。如果在应用程序中多次创建/销毁控制器,则将导致多次调用函数。幸运的是,AngularJS提供了两种有用的方法来避免内存泄漏和不良行为:

  • $on方法返回一个函数,可以调用该函数注销事件侦听器。您将需要将注销功能另存为变量供以后使用:var cleanUpFunc = $scope.$on('yourevent', ...);请参阅以下文档$on:http : //docs.angularjs.org/api/ng.$ro​​otScope.Scope#$on

  • 每当在Angular中清理范围(即销毁控制器)时,都会$destroy在该范围上触发事件。您可以注册$scope$destroy活动,然后通过致电您的活动cleanUpFunc

您可以将这两个有用的东西放在一起,以正确清理您的订阅。我整理了一个示例:http
:
//plnkr.co/edit/HGK9W0VJGip6fhYQQBCg?p=preview。如果注释掉该行cleanUpFunc();,然后几次单击“切换并执行填充”按钮,您会注意到我们的事件处理程序被多次调用,这并不是真正需要的。

现在,所有这些,要使您的特定情况正确运行,只需将代码更改QuestionsStatusController2为以下内容:

angular.module('test')
   .controller('QuestionsStatusController2',
   ['$rootScope', '$scope', '$resource', '$state',
   function ($rootScope, $scope, $resource, $state) {

    var cleanUpFunc = $rootScope.$on('action2@QuestionStatusController1', function {
         //write your listener here
    });

    $scope.$on('$destroy', function() {
        cleanUpFunc();
    });

   }]);

通过调用cleanUpFunc()$destroy,你的事件侦听器的action2@QuestionStatusController1事件将取消订阅的,当你的控制器被清理,你将不再泄漏内存。



 类似资料:
  • 问题内容: 我已经看到人们从他们的代码中的任何地方执行此操作: 然后在某些控制器中: 现在,我想广播指令中的事件。在rootScope级别广播它是一种好习惯吗?我想在控制器中处理此事件。我可以使用$ scope还是仍然必须在$ rootScope上收听? 问题答案: 就我而言,我只想将指令中的事件广播到使用该指令的视图控制器。那么使用广播仍然有意义吗? 我会让指令在控制器上调用方法,该方法在使用指

  • 问题内容: 我已经使用$ on函数将监听器注册到$ broadcast事件中 我想根据特定的业务规则取消注册此侦听器。但是我的问题是,一旦注册,我将无法注销。 AngularJS中是否有任何方法可以取消注册特定的侦听器?诸如$ on之类的方法可以注销该事件,可能是$ off。因此,基于业务逻辑,我可以说 并且当有人广播“ onViewUpdated”事件时,该函数将停止调用。 谢谢 编辑 :我想注

  • 本文向大家介绍Angularjs中的事件广播 —全面解析$broadcast,$emit,$on,包括了Angularjs中的事件广播 —全面解析$broadcast,$emit,$on的使用技巧和注意事项,需要的朋友参考一下 Angularjs中不同作用域之间可以通过组合使用$broadcast,$emit,$on的事件广播机制来进行通信 介绍: $broadcast的作用是将事件从父级作用域传

  • DALVIK线程:(互斥:TLL=0 TSL=0 TSCL=0 GHL=0) 后台进程prio=5 tid=15 WAIT group=“main”scount=1 dscount=0 obj=0x4216e7e0 self=0x400b6a18 systid=24414 nice=0 sched=0/0 cgrp=apps handle=1074723664 state=s schedstat=

  • 我正在尝试发送我的用户https://localhost:8443/在他们从Azure广告中注销后,但他们仍然停留在微软。当他们注销时,他们首先进入:https://login.microsoftonline.com/“apptenant”/oauth2/v2。0/注销?客户请求id=16d3217c-a5cf-434d-90ee-9723365ddbfa 使用正确的注销后重定向。他们点击自己的账

  • 我有一个按钮,可以设置一个动作,比如 如何从该按钮中删除此EventFilter?我尝试了方法,但应该是什么参数?