如何退订在angularJS广播事件.如何通过$上删除注册的函数

JavaScript014

如何退订在angularJS广播事件.如何通过$上删除注册的函数,第1张

1. 这是在源代码中发现:)至少在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

}

},

你的情况,你需要返回函数

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

//this will deregister that listener

offCallMeFn()

2.

编辑:这样做正确的方法是在@LiviuT的回答!

您可以随时延长角的范围,允许您删除这样的侦听器,如下所示:

//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 = 0i <eventArr.lengthi++) {

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')

这里是它在行动plunker

3.

调试代码后,我创建了自己的函数就像“blesh”的回答。因此,这是我做的

MyModule = angular.module('FIT', [])

.run(function ($rootScope) {

// Custom $off function to un-register the listener.

$rootScope.$off = function (name, listener) {

var namedListeners = this.$$listeners[name]

if (namedListeners) {

// Loop through the array of named listeners and remove them from the array.

for (var i = 0i <namedListeners.lengthi++) {

if (namedListeners[i] === listener) {

return namedListeners.splice(i, 1)

}

}

}

}

})

所以通过将我的函数$ rootscope现在它是提供给我所有的控制器。

而在我的代码我做

$scope.$off("onViewUpdated", callMe)

谢谢

编辑:AngularJS方式做 CodeGo.net,这是@LiviuT的回答!但是,如果你想取消注册该侦听器在另一个范围,并在想远离创建本地变量来保持去登记注册函数引用。这是一个可能的解决方案。

4.

此代码工作

$rootScope.$$listeners.nameOfYourBind=[]

引入sockjs.js   stomp.js

function connect() {

// 建立连接对象(还未发起连接)

    var socket =new SockJS("http://192.168.0.167:8081/endpointWisely")

    // 获取 STOMP 子协议的客户端对象

    stompClient = Stomp.over(socket)

    // 向服务器发起websocket连接并发送CONNECT帧

    stompClient.connect({},

        function (frame) {

// 连接成功时(服务器响应 CONNECTED 帧)的回调方法

            console.log('已连接' + frame)

            stompClient.subscribe("/topic/response",function (res) {

console.log(res.body)

})

},

        // 连接失败时(服务器响应 ERROR 帧)的回调方法

        function errorCallBack (error) {

console.log('连接失败' + error)

        }

)

}