ioのコネクションインスタンスをdiで注入してやらないと正常に動作しないので注意。
下記のようなファクトリーを定義してやればOK。
coreApp.factory('coreSocket', 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);
}
});
});
}
};
});
1
これを適宜コントローラーに注入してやればOK。
コントローラーはかきのような感じ。(適当に書いたやつまんまコピペ
1
coreCtrls.controller('indexCtrl', function($scope, coreSocket, $timeout) {
var chatContainer = angular.element('.messages-container');
$scope.chatStage = '';
$scope.remark = function($event) {
if ($event.type == 'keypress' && $event.which != 13) {
return false;
}
coreSocket.emit('chatPosted', $scope.message);
$scope.message = null;
}
coreSocket.on('chatPosted', function(msg) {
$scope.chatStage += msg + '\n';
$timeout(function() {
chatContainer.scrollTop(chatContainer[0].scrollHeight);
});
});
coreSocket.on('disconnect', function() {
coreSocket.disconnect();
});
});
サーバーサイドはこんな感じ。
io.on('connection', function(socket) {
console.log('a user connected');
socket.on('disconnect', function() {
console.log('user disconnected');
});
socket.on('chatPosted', function(msg) {
console.log(msg);
io.emit('chatPosted', msg);
});
});
ログインユーザーとかルームとかの概念はまだまだ調査ガ必要だなぁ。