У меня есть веб-страница с угловым, в которой я использую ngroute для перенаправления на 3 страницы.
modulo_angular.config(function($routeProvider){
//config y defi de las rutas
$routeProvider.when("/", {
controller: "appUOM",
controllerAs: "apuom",
templateUrl: "home.html"
})
.when("/descargas", {
controller: "appSocket",
controllerAs: "apsocket",
templateUrl: "descargas.html"
})
.when("/opciones", {
controller: "appPhenomena",
controllerAs: "apphen",
templateUrl: "opciones.html"
});
});
У меня 3 фабрики и 3 разных контроллера. Каждая фабрика связана с одним контроллером, поэтому я могу хранить данные даже при изменении страницы.
На одной странице "descargas" у меня есть сокеты для приема данных с сервера ym node.js. Это контроллер:
function controladorSocket($http, factoryController, socket){
var vm = this;
vm.mensajes = factoryController.getMensajes();
socket.on('mensaje', function(data){
console.log(data.message);
factoryController.addMensaje(data.message);
});
}
И это, завод сокетов:
modulo_angular.factory('socket', function ($rootScope) {
var socket = io.connect();
return {
on: function (eventName, callback) {
socket.on(eventName, function () {
var args = arguments;
$rootScope.$apply(function () {
callback.apply(socket, args);
});
});
}
};
});
Каждый раз, когда я переключаюсь с descargas.html на другую страницу и возвращаюсь, я получаю сообщения сокета так же сильно, как и измененные, которые я сделал до этого момента.
Поэтому я думаю, что моя проблема возникает из-за того, что моя функция socket.on (функция "mensaje"... должна идти в другом месте, чтобы избежать этого. Но я не знаю, как это сделать.
Вам придется уничтожить сокет вручную при изменении страницы:
function controladorSocket($http, factoryController, socket){
var vm = this;
vm.mensajes = factoryController.getMensajes();
socket.on('mensaje', function(data){
console.log(data.message);
factoryController.addMensaje(data.message);
});
this.$on('$destroy', function(){
//destroy socket
});
}