2015-08-16 19 views
6

Quando, dove e come dovrebbe faccio a sbarazzarsi di vecchi listener di eventi quando il controller non è più rilevante?Come ripulire gli eventi assegnati dal controller?

Consideriamo SPA con due percorsi: /login e /loggedin

app.factory('socket', ['$window', function(window) { 
    return window.io(); 
}]); 
app.controller('loginController', ['socket', function (socket) { 
    this.tryLogin = function(credentials) { 
     socket.emit('login', credentials); 
    } 
    sokcet.on('loginResponse', function(data) { 
     if (data.status == 'OK') { 
      // Navigate to loggedInController 
     } else { 
      // Show error message and keep listening - user might try again 
     } 
    }); 
}]); 
app.controller('loggedInController', ['socket', function (socket) {/* Logged in, but loginController is still listening for loginResponse */}]); 

Problemi:

  • Durante la navigazione verso /loggedin poi loginResponse evento continua ascolto
  • Quando si naviga di nuovo a /login pagina nuova ascoltatore viene aggiunto (in modo efficace ho 2 ascoltatori ora)

risposta

5

diano un'occhiata al caso di angolare $scope.$on('$destroy') e utilizzarlo insieme con il metodo di socket.io removeListener. Qualcosa del genere:

app.controller('loginController', ['$scope', 'socket', function ($scope, socket) { 
    this.tryLogin = function(credentials) { 
     socket.emit('login', credentials); 
    } 

    socket.on('loginResponse', loginResponse); 

    $scope.$on('$destroy', function() { 
     socket.removeListener('loginResponse', loginResponse); 
    }); 

    function loginResponse(data) { 
     if (data.status == 'OK') { 
      // Navigate to loggedInController 
     } else { 
      // Show error message and keep listening - user might try again 
     } 
    } 
}]); 
+0

Ora ho lo stesso problema con l'evento '$ destory', no? Correggimi se ho torto, sto ancora imparando angolare .. – Kristian

+0

Ohh, $ destorys scope con tutti gli ascoltatori collegati ad esso? – Kristian

+1

Quando un ambito viene distrutto in Angular tutti i gestori di eventi '$ on' associati vengono [distrutti insieme a esso] (https://stackoverflow.com/a/27016855/2039244). – sdgluck