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();
});
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;
};
},
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');
- 3 回答
- 0 关注
- 944 浏览
添加回答
举报