События сокетов запускаются несколько раз при переключении состояний в приложении AngularJS
Я подключаю приложение Angular JS, имеющее несколько состояний (Маршруты), с Node-сервером (Socket), работающим на сервере. Когда я захожу в какое-то другое состояние и возвращаюсь в состояние, в котором написан код сокета, он снова регистрируется, и, когда происходит событие, несколько раз вызывается функция, что влияет на производительность.
var socket = io.connect('127.0.0.1:3000');
socket.on("connect",function(){
console.log("connected");
});
socket.on("test-channel:App\\Events\\NewMessage", function(message) {
if (vm.questions.length < 3) {
console.log("question fetching started");
vm.fetch_q();
}
});
Я попытался включить io.connect('localhost') в службу также и поместить только событие в контроллер, но затем оно также запускается несколько раз.
1 ответ
Проблема в том, что ваш контроллер устанавливает событие "on" каждый раз, когда вы обращаетесь к этому контроллеру, и он не удаляет его только при обновлении.
Если вы используете AngularJS, вы можете просто объявить $rootScope.socket = io.connect('127.0.0.1:3000');
затем используйте его в своих контроллерах, как это $rootScope.socket.emit('event', {});
тот же метод, когда вы хотите прослушать событие, но использовать on
поставленный emit
,
В любом случае, это метод, который увеличивает производительность и способ разработки программы, но проблема из вашего вопроса все еще остается, потому что не очень хорошо держать слушателей событий в ваших контроллерах - только если вы что-то излучаете.
Вы можете решить проблему, используя прослушиватели событий в сервисе AngularJS Run.
app.run(function($rootScope){
$rootScope.socket.on('event', function(){
// Do something..
});
}
И если у вас есть больше событий для прослушивания, вы можете объявить событие в модуле, тогда требуется модуль в run
оказание услуг. Надеюсь, будет хорошим решением для вас.