接着上一篇
使用angularjs构建聊天室的client
<!doctype html> <html ng-app="justChatting"> <head> <meta charset="UTF-8"> <title>justChatting</title> <link rel="stylesheet" href="/bower_components/bootstrap/dist/css/bootstrap.min.css"> <link rel="stylesheet" href="/stylesheets/room.css"> <script type="text/javascript" src="/socket.io/socket.js"></script> <script type="text/javascript" src="/bower_components/jquery/dist/jquery.js"></script> <script type="text/javascript" src="/bower_components/bootstrap/dist/js/bootstrap.min.js"></script> <script type="text/javascript" src="/bower_components/angular/angular.js"></script> </head> <body> <script type="text/javascript"> var socket=io.connect('/'); socket.on('connected',function(){ alert('connected to justChatting!'); }); </script> <div class="navbar navbar-inverse navbar-fixed-top"> <div class="container"> <div class="navbar-header"> <a class="navbar-brand" href="#">justChatting</a> </div> </div> </div> <div class="container" style="margin-top:100px;"> <div class="col-md-12"> <div class="panel panel-default room" ng-controller="RoomCtrl"> <div class="panel-heading room-header">justChatting</div> <div class="panel-body room-content"> <div class="list-group messages" auto-scroll-to-bottom> <div class="list-group-item message" ng-repeat="message in messages"> 某某: {{message}} </div> </div> <form class="message-creator" ng-controller="MessageCreatorCtrl"> <div class="form-group"> <textarea required class="form-control message-input" ng-model="newMessage" ctrl-enter-break-line="createMessage()" placeholder="Ctrl+Enter to quick send"></textarea> </div> </form> </div> </div> </div> </div> <script type="text/javascript" src="javascripts/node.js"></script> </body> </html>
改动node.js
angular.module('justChatting', []) angular.module('justChatting').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) } }) }) } } }) angular.module('justChatting').directive('ctrlEnterBreakLine', function() { return function(scope, element, attrs) { var ctrlDown = false element.bind("keydown", function(evt) { if (evt.which === 17) { ctrlDown = true setTimeout(function() { ctrlDown = false }, 1000) } if (evt.which === 13) { if (ctrlDown) { element.val(element.val() + ' ') } else { scope.$apply(function() { scope.$eval(attrs.ctrlEnterBreakLine); }); evt.preventDefault() } } }); }; }); angular.module('justChatting').controller('MessageCreatorCtrl', function($scope, socket) { $scope.createMessage = function () { socket.emit('messages.create', $scope.newMessage) $scope.newMessage = '' } }) angular.module('justChatting').directive('autoScrollToBottom', function() { return { link: function(scope, element, attrs) { scope.$watch( function() { return element.children().length; }, function() { element.animate({ scrollTop: element.prop('scrollHeight') }, 1000); } ); } }; }); angular.module('justChatting').controller('RoomCtrl', function($scope, socket) { $scope.messages = [] socket.on('messages.read', function (messages) { $scope.messages = messages }) socket.on('messages.add', function (message) { $scope.messages.push(message) }) socket.emit('messages.read') })
一个简陋的聊天室完毕。