为了账号安全,请及时绑定邮箱和手机立即绑定

如何取消订阅angularJS中的广播事件。如何删除通过$ on注册的功能

如何取消订阅angularJS中的广播事件。如何删除通过$ on注册的功能

精慕HU 2019-12-10 09:39:06
我已经使用$ on函数将我的侦听器注册到$ broadcast事件$scope.$on("onViewUpdated", this.callMe);我想根据特定的业务规则取消注册此侦听器。但是我的问题是,一旦注册,我将无法注销。AngularJS中有什么方法可以取消注册特定的侦听器?诸如$ on之类的方法可以注销该事件,可能是$ off。因此,基于业务逻辑,我可以说 $scope.$off("onViewUpdated", this.callMe);并且当有人广播“ onViewUpdated”事件时,该函数将停止调用。谢谢编辑:我想注销另一个功能的侦听器。不是我注册的功能。
查看完整描述

3 回答

?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

查看大多数答复,它们似乎过于复杂。Angular具有内置的注销机制。


使用以下命令返回$on的注销功能:


// Register and get a handle to the listener

var listener = $scope.$on('someMessage', function () {

    $log.log("Message received");

});


// Unregister

$scope.$on('$destroy', function () {

    $log.log("Unregistering listener");

    listener();

});


查看完整回答
1 反对 回复 2019-12-10
?
大话西游666

TA贡献1817条经验 获得超14个赞

您需要存储返回的函数并调用它以取消订阅该事件。


var deregisterListener = $scope.$on("onViewUpdated", callMe);

deregisterListener (); // this will deregister that listener

至少在1.0.4中可以在源代码中找到它:)。由于简短,我将发布完整的代码


/**

  * @param {string} name Event name to listen on.

  * @param {function(event)} listener Function to call when the event is emitted.

  * @returns {function()} Returns a deregistration function for this listener.

  */

$on: function(name, listener) {

    var namedListeners = this.$$listeners[name];

    if (!namedListeners) {

      this.$$listeners[name] = namedListeners = [];

    }

    namedListeners.push(listener);


    return function() {

      namedListeners[indexOf(namedListeners, listener)] = null;

    };

},


查看完整回答
反对 回复 2019-12-10
?
慕容3067478

TA贡献1773条经验 获得超3个赞

正确的方法是在@LiviuT的答案!


您总是可以扩展Angular的范围,以允许您删除此类侦听器,如下所示:


//A little hack to add an $off() method to $scopes.

(function () {

  var injector = angular.injector(['ng']),

      rootScope = injector.get('$rootScope');

      rootScope.constructor.prototype.$off = function(eventName, fn) {

        if(this.$$listeners) {

          var eventArr = this.$$listeners[eventName];

          if(eventArr) {

            for(var i = 0; i < eventArr.length; i++) {

              if(eventArr[i] === fn) {

                eventArr.splice(i, 1);

              }

            }

          }

        }

      }

}());

这是它的工作方式:


  function myEvent() {

    alert('test');

  }

  $scope.$on('test', myEvent);

  $scope.$broadcast('test');

  $scope.$off('test', myEvent);

  $scope.$broadcast('test');


查看完整回答
反对 回复 2019-12-10
  • 3 回答
  • 0 关注
  • 898 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信