加载新路由后,控制器的旧实例仍然 运行

After loading a new route old instances of controller is still running

我有一个根据参数加载页面的路由:

.when('/:num/:den', {
templateUrl : 'app/views/templates/home.html',
controller :"ProductContoller",
controllerAs: "product",
reloadOnSearch : false });

问题是每次我重新加载路线时,都会有一个新的控制器实例以及所有以前的实例 运行。 我的控制器中有 Socket.IO 个侦听器,以便在发生任何更新时从服务器获取一些数据。

为了防止其他人遇到同样的问题,我使用的是 Socket.IO,它的监听器仍然是 运行,所以我添加了套接字发射器方法 removeAllListeners,它与 removeListener 的方法相同, removeListenerEvent 和关闭。 现在,当我收到“$destroy”事件时,我只是通过不向方法传递任何参数来删除所有这些侦听器,或者我可以通过说明事件的名称或什至通过说明事件名称和名称来删除特定的处理程序处理函数。

以下是来自 Socke.IO 来源的代码!

Emitter.prototype.off =
Emitter.prototype.removeListener =
Emitter.prototype.removeAllListeners =
Emitter.prototype.removeEventListener = function(event, fn)

这就是我将所有需要的方法传递给我的服务的方式:

.factory('socketio', ["$rootScope", function ($rootScope) {
        var socket = io.connect();
        console.log(socket);
        return {
            on : function (eventName, callback) {
                socket.on(eventName, function () {
                    var args = arguments;
                    $rootScope.$apply(function () {
                        callback.apply(socket, args);
                    });
                });

            },
            removeAllListeners : function (eventName, callback) {
                socket.removeAllListeners(eventName, callback);
            },

            emit : function (eventName, data, callback) {
                socket.emit(eventName, data, function () {
                    var args = arguments;
                    $rootScope.apply(function () {
                        if (callback)
                            callback.apply(socket, args);
                    });
                });

            }

        };

    }
]);