2015-08-16 16 views
6

Khi, nơicách tôi có nên loại bỏ trình xử lý sự kiện cũ khi bộ điều khiển không còn phù hợp nữa không?Làm cách nào để xóa các sự kiện được chỉ định từ bộ điều khiển?

Cân nhắc SPA với hai tuyến đường: /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 */}]); 

vấn đề:

  • Khi điều hướng đến /loggedin sau đó loginResponse sự kiện tiếp tục nghe
  • Khi điều hướng trở lại /login trang mới nghe được thêm vào (có hiệu quả tôi có 2 người nghe tại)

Trả lời

5

Hãy nhìn vào sự kiện $scope.$on('$destroy') góc và sử dụng nó cùng với phương pháp socket.io của removeListener. Một cái gì đó như thế này:

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

Bây giờ tôi có cùng một vấn đề với sự kiện '$ destory', phải không? Đúng nếu tôi sai, vẫn đang học góc .. – Kristian

+0

Ohh, $ destorys phạm vi với tất cả người nghe gắn liền với nó? – Kristian

+1

Khi phạm vi bị hủy trong Angular, tất cả các trình xử lý sự kiện '$ on' được liên kết là [bị hủy cùng với nó] (https://stackoverflow.com/a/27016855/2039244). – sdgluck

Các vấn đề liên quan