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

时间:2016-11-14 12:31:34

标签: angularjs socket.io angularjs-controller angularjs-ng-route

我有一条基于参数加载页面的路线:

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

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

1 个答案:

答案 0 :(得分:2)

如果其他人有同样的问题,我使用的是Socket.IO,而且它的监听器仍在运行,所以我添加了套接字Emitter方法,removeAllListeners,这与removeListener,removeListenerEvent和off相同。 现在,当我得到“$ 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);
                    });
                });

            }

        };

    }
]);