Ich benutze nodejs mit socket.io und angularjs auf dem Client. Ich habe eckige-socketio Beispiel aus dem Internet aufgenommen und disconnect
Methode zu It hinzugefügt.Node.js + AngularJS + socket.io: verbinden Zustand und manuell trennen
Sockel Service:
angular.module('app')
.factory('socket', ['$rootScope', 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);
}
});
})
},
disconnect: function() {
socket.disconnect();
},
socket: socket
};
}]);
Controller:
angular.module('app')
.controller('Controller', ['$scope', 'socket', function ($scope, socket) {
socket.emit('register')
socket.on('connect', function() {
console.log('Socket connected');
});
socket.on('disconnect', function() {
console.log('Socket disconnected');
});
socket.on('register', function (reginfo) {
console.log('Register: %s, cname=%s', reginfo.ok, reginfo.cname);
socket.disconnect(); // <-- this line throw Error
});
socket.on('last', updateSnapshot);
socket.on('state', updateSnapshot);
function updateSnapshot(snapshot) { ... }
}]);
Aber wenn ich versuche, verwenden Sie diese Methode trennen ertappe ich Fehler:
Error: $apply already in progress
at Error (<anonymous>)
at beginPhase (http://localhost:4000/scripts/vendor/angular.js:8182:15)
at Object.$get.Scope.$apply (http://localhost:4000/scripts/vendor/angular.js:7984:11)
at SocketNamespace.on (http://localhost:4000/scripts/services/socket.js:10:32)
at SocketNamespace.EventEmitter.emit [as $emit] (http://localhost:4000/socket.io/socket.io.js:633:15)
at Socket.publish (http://localhost:4000/socket.io/socket.io.js:1593:19)
at Socket.onDisconnect (http://localhost:4000/socket.io/socket.io.js:1970:14)
at Socket.disconnect (http://localhost:4000/socket.io/socket.io.js:1836:12)
at SocketNamespace.<anonymous> (http://localhost:4000/scripts/controllers/controller.js:38:34)
at on (http://localhost:4000/scripts/services/socket.js:11:34)
Und ich verstehe nicht, wo zu graben ...
Dank Brandon! Sieht aus wie ein Hack, aber es funktioniert. Wie denkst du, sollte diese Überprüfung in eckigen Kern sein? –
Es gibt einen Check-in-Kern - aber es wirft einen Fehler auf! Ich denke, der Grund, dass die "sichere Anwendung" nicht im Kern ist, ist, dass es normalerweise keinen guten Grund gibt, "$ apply" zu verschachteln - sie zu haben ist normalerweise ein Zeichen dafür, dass du irgendwo einen Fehler hast. Dieser Fall ist jedoch insofern etwas einzigartiger, als Sie eine Bibliothek eines Drittanbieters einpacken, die standardmäßig nicht in Angular integriert ist. –
Es gibt viele coole Bibliotheken, die standardmäßig nicht integriert sind und eine ganze Reihe von Fragen, wie man sie mit Angular verwenden kann. –