2015-08-16 32 views
6

,其中如何我應該擺脫舊的事件監聽器,當控制器不相關了嗎?如何清理從控制器分配的事件?

考慮SPA有兩條路線:/login/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 */}]); 

問題:

  • 當導航到/loggedin然後loginResponse事件不斷聽
  • 當瀏覽回/login監聽器被添加(實際上我現在有2位聽衆)

回答

5

看看角的$scope.$on('$destroy')事件,並與socket.io的removeListener方法一起使用。這樣的事情:

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

現在我有'$ destory'事件相同的問題,不是嗎?糾正我,如果我錯了,仍然學習角.. – Kristian

+0

哦,$範圍destorys與所有的監聽連接到它? – Kristian

+1

當範圍在Angular中被銷燬時,所有相關的'$ on'事件處理函數都會[與其一起銷燬](https://stackoverflow.com/a/27016855/2039244)。 – sdgluck

相關問題