gpt4 book ai didi

javascript - 带有 Angular 的 socket.io 不会立即显示消息

转载 作者:搜寻专家 更新时间:2023-11-01 00:14:25 24 4
gpt4 key购买 nike

我正在尝试使用 socket.io 和 Angular 创建即时消息应用程序(聊天)。我有 2 个文件:index.html 和 index.js,如下所示。聊天工作正常,但当我按下“发送”按钮时,我不会立即在聊天窗口中看到消息。当我用鼠标光标按下输入文本字段时,我只会看到消息...我做错了什么?

此外,我还将标签

  • 视为文本的一部分。我希望这个标签是一个 html 标签,而不是文本字符串...

    谢谢

    index.html

    <html>
    <head>
    <title>My Chat</title>
    <link rel="stylesheet" type="text/css" href="css/style.css">
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
    <script src="/socket.io/socket.io.js"></script>
    </head>
    <body>
    <div ng-app="myApp" ng-controller="myCtrl">
    {{ message }}
    <form >
    <input autocomplete="off" ng-model="exampleText" type="text" />
    <button type='button' ng-click="submit()">
    Send
    </button>
    </form>
    </div>
    <script>

    var app=angular.module("myApp", []);
    var socket = io();
    app.controller("myCtrl", function($scope) {
    $scope.message='';
    $scope.submit=function(){
    socket.emit('chat message', angular.copy($scope.exampleText));
    $scope.exampleText='';
    return false;
    }
    socket.on('chat message', function(msg){
    $scope.message=$scope.message+" <li> "+ msg;
    });
    });

    </script>
    </body>
    </html>

    索引.js

    var express = require('express');
    var app = express();
    var http = require('http').Server(app);
    var io = require('socket.io')(http);
    app.use(express.static(__dirname + '/'));
    app.get('/', function(req, res){
    res.sendFile(__dirname + '/index.html');
    });

    io.on('connection', function(socket){
    console.log('a user connected');


    socket.on('chat message', function(msg){
    io.emit('chat message', msg);
    });


    socket.on('disconnect', function(){
    console.log('user disconnected');
    });


    });

    http.listen(3000, function(){
    console.log('listening on *:3000');
    });

  • 最佳答案

    首先,消息延迟。查看聊天消息处理程序:

    socket.on('chat message', function(msg){
    $scope.message=$scope.message+" <li> "+ msg;
    });

    - 这里的问题是消息更新发生在范围摘要循环之外。尝试以下操作:

    socket.on('chat message', function(msg){
    $scope.$apply(function() {
    $scope.message=$scope.message+" <li> "+ msg + "</li>";
    });
    });

    下一步,如果你想摆脱“li”标签的显示,你需要停止在你的 Controller 中构建 HTML 并直接显示传入的消息。这可以通过使“消息”成为消息数组来实现。在您的 HTML 布局中,替换:

    {{ message }}

    <ul>
    <li ng-repeat="message in messages">{{message}}</li>
    </ul>

    然后替换,在controller中

    $scope.message='';

    $scope.messages = [];

    最后将聊天消息处理程序更改为:

    socket.on('chat message', function(msg){
    $scope.messages.push(msg);
    });

    这样就可以了。

    关于javascript - 带有 Angular 的 socket.io 不会立即显示消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37630740/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com