Je veux utiliser socket.io dans AngularJS. J'ai trouvé la fabrique suivante :
app.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);
});
});
},
emit: function (eventName, data, callback) {
socket.emit(eventName, data, function () {
var args = arguments;
$rootScope.$apply(function () {
if (callback) {
callback.apply(socket, args);
}
});
})
}
};
et il est utilisé dans le contrôleur comme :
function MyCtrl($scope, socket) {
socket.on('message', function(data) {
...
});
};
Le problème est qu'à chaque fois que le contrôleur est visité, un autre écouteur est ajouté, de sorte que lorsqu'un message est reçu, il est traité plusieurs fois.
quelle peut être une meilleure stratégie pour intégrer socket.io avec AngularJS ?
EDIT : Je sais que je peux ne rien retourner dans la factory et faire l'écoute à cet endroit, puis utiliser $rootScope.$broadcast et $scope.$on dans les contrôleurs, mais cela ne semble pas être une bonne solution.
EDIT2 : ajouté à l'usine
init: function() {
socket.removeAllListeners();
}
et l'appeler au début de chaque contrôleur qui utilise socket.io.
ne semble toujours pas être la meilleure solution.