3 回答

TA貢獻(xiàn)1757條經(jīng)驗 獲得超8個贊
查看大多數(shù)答復(fù),它們似乎過于復(fù)雜。Angular具有內(nèi)置的注銷機(jī)制。
使用以下命令返回$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貢獻(xiàn)1817條經(jīng)驗 獲得超14個贊
您需要存儲返回的函數(shù)并調(diào)用它以取消訂閱該事件。
var deregisterListener = $scope.$on("onViewUpdated", callMe);
deregisterListener (); // this will deregister that listener
至少在1.0.4中可以在源代碼中找到它:)。由于簡短,我將發(fā)布完整的代碼
/**
* @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貢獻(xiàn)1773條經(jīng)驗 獲得超3個贊
正確的方法是在@LiviuT的答案!
您總是可以擴(kuò)展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 關(guān)注
- 985 瀏覽
添加回答
舉報