不会调用ng-click函数

时间:2017-08-30 04:35:51

标签: angularjs node.js socket.io

<body ng-app="groupChatApp" ng-controller="groupChatController">
    <div id="error-container">{{errorValue}}</div>
    <div ng-model="changeForm" id="changeForm">
        <input id="name" type="text" name="name" value="" placeholder="ENTER YOU NAME!" ng-model="name">
        <button type="button" name="button" ng-click="setUsername()">Let me chat!</button>
    </div>
</body>
<script>
    var app = angular.module('groupChatApp', []);
    app.controller('groupChatController', function ($scope) {
        $scope.errorValue = "";
        $scope.messageDisplay = "";
        var socket = io();
        $scope.setUsername = function () {
            socket.emit('setUsername', $scope.name);
        }
        $scope.sendMessage = function () {
            var msg = document.getElementById('message').value;
            if (msg) {
                socket.emit('msg', {message: msg, user: user});
            }
        }
        var user;
        socket.on('userExists', function (data) {
            $scope.errorValue = data;
        });
        socket.on('userSet', function (data) {
            user = data.username;
            document.getElementById('changeForm').innerHTML = '<input type="text" id="message"><button type="button" ng-click="sendMessage()">Send</button>'
                    + '<div id="message-container"></div>';
            ;
        });
        socket.on('newmsg', function (data) {
            if (user) {
                document.getElementById('message-container').innerHTML += '<div><b>' + data.user + '</b>: ' + data.message + '</div>'
            }
        });
    });
</script>

我正在尝试的是socket.io群聊应用程序 - 节点js。 在此处,单击按钮时ng-click不起作用。我觉得它没有进入功能。当我使用onclick和它的功能名称时。但ng-click没有。我无法发现它。任何帮助将不胜感激。

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

app.get('/', function (req, res) {
    res.sendfile('index.html');
});

users = [];
io.on('connection', function (socket) {
    console.log('A user connected');
    socket.on('setUsername', function (data) {

        if (users.indexOf(data) > -1) {
            socket.emit('userExists', data + ' username is taken! Try some other username.');
        } else {
            console.log(data);
            users.push(data);
            socket.emit('userSet', {username: data});
        }
    });

    socket.on('msg', function (data) {
        io.sockets.emit('newmsg', data);
        console.log('hi');
    })
});

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

这是我在节点js中的脚本文件

1 个答案:

答案 0 :(得分:1)

  单击按钮后,

ng-click无效。我觉得这样   没有进入功能。

没有调用哪个函数?

我看到你正在将纯Javascript与AngularJS混合,这不是最好的主意。当您尝试使用AngularJS时,请尝试坚持使用它,尝试以“Angular”方式进行操作。

我只看到一个无法调用的函数 - sendMessage(),我认为你已经到了成功进入聊天室的地步。现在我将解释为什么不调用你的函数:

您正在动态更新HTML - angular对您的新HTML一无所知。为了让角度知道这个新HTML应该做什么,你需要编译这个HTML所需的范围。例如,您可以像这样更改代码:

// use angular to get this element and not the getElementById function
var container = angular.element('#changeForm');

// update HTML using html() method
container.html(
        '<input type="text" id="message">' +
        '<button type="button" ng-click="sendMessage()">Send</button>' +
        '<div id="message-container"></div>'
);

// now in order your new HTML to work you need to compile it
$compile(container)($scope);

如果我们希望上述代码能够正常运行,我们需要注入 $compile 服务:

app.controller('groupChatController', function ($scope, $compile) { ...

其他东西:

var socket = io();

// I think above code should be 
var socket = io('http://localhost:3000');

结论

此代码可以使用,但我强烈反对您这样做。

我会做什么:

  • 使用 ng-view + ng-route 将聊天室登录视图与聊天室视图分开 - 请参阅this,例如如何使用ng -view和ng-route
  • 为聊天室登录和实际聊天室使用不同的控制器
  • 使用AngularJS为我们提供的神奇绑定更新我的观点,并通过 VanillaJS (getElementById,querySelector等等) 更新视图

所以当使用AngularJS时:

document.getElementById('message-container').innerHTML += '<div><b>' + data.user + '</b>: ' + data.message + '</div>';

是一种不好的做法,您应该将其更改为:

<强> HTML

<ul id="message-container">
    <li ng-repeat="message in messages">
        <span>{{message.user}}:</span>
        <span>{{message.message}}</span>  
    </li>
</ul>

<强> JS

$scope.messages = [];
socket.on('newmsg', function (data) {
    if (user) {
        $scope.messages.push(data);
    }
});

使用AngularJS时,尝试使用更多Angular样式:)