我正在测试一个包装Socket.IO的Angular服务。为此,我需要监听我正在创建的同一个套接字发出的事件。
这是服务:
angular.module('core').factory('SocketIOService', ['$rootScope',
function($rootScope) {
var socket = io();
return {
on: function(eventName, callback) {
var args = arguments;
socket.on(eventName, function() {
$rootScope.$apply(function() {
callback.apply(socket, args);
});
});
}
};
}
]);
一段测试文件(SocketIOService
是我正在创建的服务,socket
是来自io()
的全局单例返回值,$rootScope
是注入的$rootScope
):
it('should apply changes using $rootScope.$apply', function() {
var rootScopeSpy = sinon.spy($rootScope, '$apply');
SocketIOService.on('anEvent', function() {});
socket.emit('anEvent', {});
expect(rootScopeSpy.calledOnce).toBe(true);
});
但是,socket
没有“听到”它正在侦听的事件本身也会发出声音。有没有办法发出一个事件,还能听(并'听')那个事件?
答案 0 :(得分:0)
在html中:你必须包含< script src =“http://yourdomain/socket.io/socket.io.js”>在标题中。
在Angular中:
$scope.socket = new function () {
var self = this;
var socketIO;
var socketConfig = {};
self.connect = function () {
if (socketIO) {
socketIO.connect(socketConfig);
return;
}
socketIO = io(window.location.protocol + '//' + window.location.hostname + ":7777", socketConfig);
socketIO.on('connect', function () {
$scope.$apply();
});
socketIO.on('your_event', function (data) {
// dosomething
$scope.$apply();
});
};
self.get_data = function () {
socketIO.emit('get_data', your data);
};
}
$scope.socket.connect();