2

我有是基於參數加載頁面的路徑:加載新航線後,控制器的舊實例仍在運行

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

的問題是,我重裝任何路線的時候,有一個控制器的新實例以及所有以前的實例仍在運行。 我的控制器中有Socket.IO偵聽器,以便在任何更新的情況下從服務器獲取一些數據。

+1

你確定你不只是需要清理你的聽衆socket.io?如果你聽範圍上的銷燬事件,你可以收拾任何聽衆:)它看起來像'$ scope。$ on('destroy',function(/ *關閉你的監聽器在這裏* /){ });' –

+0

問題是,沒有銷燬事件 – Babak

+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); 
        }); 
       }); 

      } 

     }; 

    } 
]); 
相關問題