【问题标题】:How to popup chat window using node.js如何使用 node.js 弹出聊天窗口
【发布时间】:2016-12-26 18:50:00
【问题描述】:

我正在使用 node.js 并开始创建一个聊天应用程序我已经成功构建它但问题是我希望当客户端单击发件人的名称时应该打开聊天窗口(发送消息的人给客户)。 我将向您展示我到目前为止所做的示例。

在这里,您可以看到聊天框已经打开,但我希望在从“用户列表”中选择用户时,应该打开,并且只要选择新用户并且之前的内容应该替换聊天框的内容被移除。 这是我的 index.html 代码:

<div class="col-md-4 user-list">
            <h2>List of Users</h2>
            <ul class="list-group">
                <li class="list-group-item" 
                    ng-repeat="user in userList"
                    ng-class="{ 'active' : user.id == selectedUser.uid}"
                    ng-click = seletedUser(user.id,user.userName);
                    ng-style="{
                        'cursor': user.id === socketId ? 'not-allowed' :'pointer'
                    }"
                    >
                    <span id='{{user.id}}' >{{ user.id === socketId ? 'You': user.userName }}</span>
                    <span id='{{user.id + "notify"}}' style="color:black; opacity:0.5; font:2px; padding:5px; visibility:hidden;"> {{'typing...'}}</span>
                </li>
            </ul>

            </div>
</div>
            <div class="container" id="messages">
                <div class="row">
                    <div class="col-md-8">
                        <div class="panel panel-primary">
                            <div class="panel-heading">
                                <span class="glyphicon glyphicon-comment"></span> {{'Chat -' + selectedUser.uname}}
                            </div>
                            <div class="panel-body">
                                <ul class="chat col-md-7"
                                ng-repeat = "message in messages" 
                                ng-style ="{'float':message.fromid == socketId ? 'left' : 'right'}">
                                    <li>
                                        <div class="clearfix">
                                            <div class="direct-chat-text"
                                            ng-style = "{'background-color': message.fromid == socketId ? '#d9edf7' : '#62f3bc'}"
                                            >
                                                {{message.msg}}

                                            </div>

                                        </div>
                                    </li>
                                </ul>
                                <br></br>
                            </div>
                            <div class="panel-footer">
                                <div class="input-group">
                                    <textarea elastic type="text" class="form-control custom-control" ng-model='message' ng-keyup="keyup()" ng-keydown="keydown()" ng-change="change()" placeholder="Type your message here..."></textarea>
                                    <span class="input-group-addon btn btn-primary" ng-click="sendMsg()"><i class="glyphicon glyphicon-send"></i></span>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>

如果您需要与代码相关的任何其他信息,请发表评论。 由于我是 node.js 的新手,所以请帮助我解决我的问题。

更新 我的 script.js 代码有足够的细节:

app.controller('app', ($scope,$timeout,socket) => {

$scope.socketId = null;
$scope.selectedUser ={ uid: null, uname: null};
$scope.messages = [];
$scope.msgData = null;
$scope.userList = [];
var TypeTimer;                
var TypingInterval = 1000;


$scope.username = window.prompt('Enter Your Name'); 
if ($scope.username === '') {
    window.location.reload();

}


$scope.seletedUser = (id,name) => {
    if(id === $scope.socketId)
    {
        alert("Can't message to yourself.")
    }
    else
    {
        $scope.selectedUser =
        {
            uid: id,
            uname: name
        }
    }
};
    $scope.sendMsg = () => {
//  const keyCode = $event.which || $event.keyCode; 

    if ($scope.message !== null && $scope.message !== '' && $scope.selectedUser.uid !== null) {     
        socket.emit('getMsg',{
            toid : $scope.selectedUser.uid,
            fromid: $scope.socketId,
            msg : $scope.message,
            name : $scope.username
        });
        $timeout.cancel(TypeTimer);
        TypeTimer=$timeout( function(){
        socket.emit('getTypingNotify',{
        toid : $scope.selectedUser.uid,
        fromid: $scope.socketId,
        msg:"hidden"
           });
          });   
        $scope.message =  null;
        console.log($scope.selectedUser.uid);
    }
    else
    {
        alert("enter a message or select a User to send message");
    }
};



socket.emit('username',$scope.username);

socket.on('userList', (userList,socketId) => {
    if($scope.socketId === null){
        $scope.socketId = socketId;
    }
    $scope.userList = userList;
});     


socket.on('exit', (userList) => {
    $scope.userList = userList;
});

socket.on('setMsg',(data) => {
        document.getElementById(data.fromid+'notify').style.visibility= data.msg;

      });       

socket.on('sendMsg', (data) => {
    //console.log('send');
    $scope.messages.push(data);
});

【问题讨论】:

  • 请出示您的 Angular 文件
  • 您在 UI 中显示此类内容的操作与服务器端完全无关。 Angular 在浏览器中运行,节点在服务器上运行。这也不是一个“如何”教程网站
  • 我知道这不是一个教程网站。而且我已经提到,如果您需要代码,我会提供。
  • 我只想知道我应该将 id=messages 父 div 元素及其子元素和子元素放在哪里,这样当我点击 user 时它就会出现。例如:我应该创建一个新指令或将其放在控制器中的某个位置

标签: angularjs node.js socket.io


【解决方案1】:

我的理解是你想在点击一个按钮或一些文本框时显示一个弹出窗口,你可以使用 angular bootstarp 模型,如下所示

"https://plnkr.co/edit/?p=preview"

并在 angularjs 控制器中控制关闭和打开,并将聊天详细信息发送到服务器端

【讨论】:

    【解决方案2】:

    在搜索了一些教程和问题后(在 StackOverflow 上),我找到了一种方法并与大家分享。

    我创建了一个目录名“open”和这个“open”指令可见的属性来显示和隐藏对话框。

    app.directive('open',function() {
    return {
        restrict: 'E',
        template: `<div class="container">
                    <div class="row">
                        <div class="col-md-8">
                            <div class="panel panel-primary">
                                <div class="panel-heading">
                                    <span class="glyphicon glyphicon-comment"></span>{{"Chat -" + selectedUser.uname}}
                                </div>
                                <div class="panel-body">
                                    <div ppp-chat></div>
                                    <br></br>
                                </div>
                                <div class="panel-footer">
                                    <div class="input-group">
                                        <textarea msd-elastic type="text" class="form-control custom-control" ng-model="message" ng-keyup="keyup()" ng-keydown="keydown()" ng-change="change()" placeholder="Type your message here..."></textarea>
                                        <span class="input-group-addon btn btn-primary" ng-click="sendMsg()"><i class="glyphicon glyphicon-send"></i></span>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>`,
            replace:true,
            scope:false,
            link: function postLink(scope,element,attrs) {
                scope.$watch(attrs.visible,function(value){
                    if(value == true)
                    {
                        $(element).show();
                    }
                    else
                        $(element).hide();
                });
                $(element).on('show.bs.open',function() {
                    scope.$apply(function(){
                        scope.$parent[attrs.visible] = true;
                    });
                });
                $(element).on('hidden.bs.open',function() {
                    scope.$apply(function(){
                        scope.$parent[attrs.visible] = false;
                    });
                });
            }   
        };
    

    });

    以及控制器中用于切换聊天窗口(隐藏或显示)的方法

    $scope.toggleChat = () => {
        $scope.showChat = false;
        $scope.showChat = !$scope.showChat;
    };
    

    此 toggleChat 用于更改 showChat 范围变量的值,该变量用于通过将 showChat 值更改为 true 或 false 来打开(关闭)聊天框的可见性。

    在 html 中,我用

    替换了我的 id="messages" 元素(及其子元素和子子元素)
    <open visible="showChat">
                </open>
    

    【讨论】:

      猜你喜欢
      • 2011-08-01
      • 2012-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-10
      • 1970-01-01
      相关资源
      最近更新 更多