当前位置: 首页 > news >正文

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')
})


一个简陋的聊天室完毕。


项目源代码地址:https://github.com/edagarli/chattingnode

相关文章:

  • BUG系列
  • openstack环境准备
  • MYSQL远程登录权限设置(转)
  • linux 下 NFS服务器配置
  • Spoj 2713 Can you answer these queries IV 水线段树
  • swap函數 进阶探讨与实现
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • Badboy - 从excel中读取数据
  • spring - ioc和aop
  • Java中内存分配
  • Android--获取系统时间的几种方式
  • PLSQL Developer过期要注冊表
  • JavaScript中call,apply,bind方法的总结。
  • Spring MVC入门
  • umount device is busy
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 2017届校招提前批面试回顾
  • C语言笔记(第一章:C语言编程)
  • iOS编译提示和导航提示
  • Laravel Telescope:优雅的应用调试工具
  • Rancher如何对接Ceph-RBD块存储
  • React-redux的原理以及使用
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • Sublime Text 2/3 绑定Eclipse快捷键
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 普通函数和构造函数的区别
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 算法---两个栈实现一个队列
  • 新手搭建网站的主要流程
  • 一个JAVA程序员成长之路分享
  • 移动端解决方案学习记录
  • 大数据全解:定义、价值及挑战
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • #define
  • #图像处理
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (39)STM32——FLASH闪存
  • (done) 两个矩阵 “相似” 是什么意思?
  • (Python) SOAP Web Service (HTTP POST)
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (四)模仿学习-完成后台管理页面查询
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET Project Open Day(2011.11.13)
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .NET多线程执行函数
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • .Net组件程序设计之线程、并发管理(一)
  • .sys文件乱码_python vscode输出乱码