socket.io+angular.js+express.js做个聊天应用(四)
接着上一篇
使用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() + '\n') } 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') })
一个简陋的聊天室完毕。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架