Javascript Socket.IO消息不';t更新角度变量

Javascript Socket.IO消息不';t更新角度变量,javascript,angularjs,node.js,sockets,Javascript,Angularjs,Node.js,Sockets,我有一个socket.io客户端服务器设置,在客户端上运行AngularJS // Server.js var io = require('socket.io')(server); io.on('connection', function (socket) { socket.on('message', function (msg) { //console.log(msg); console.log(msg); io.emit('message', msg); })

我有一个socket.io客户端服务器设置,在客户端上运行AngularJS

// Server.js
var io = require('socket.io')(server);


io.on('connection', function (socket) {
 socket.on('message', function (msg) {
    //console.log(msg);
    console.log(msg);
    io.emit('message', msg);
 });
});
正如所观察到的,它本质上发出一个
消息
事件,其中数据存储在变量
msg

然后我有下面的客户端代码

var container = angular.module("AdminApp", []);

container.controller("StatsController", function($scope) {

    var socket = io.connect();

    socket.on('message', function (msg) {
        console.log(msg);
        $scope.frontEnd = msg;
    });
});
我现在面临一个奇怪的问题。当我编写以下代码片段打印
frontEnd
时,它不会显示。但是
console.log(msg)
工作,它向我显示从变量
msg
发出的数据

<body ng-app="AdminApp">

    <div ng-controller="StatsController">
        <p>{{frontEnd}}</p> //Doesn't show anything
    </div>

</body>

{{frontEnd}}

//不显示任何内容


有人能帮我吗?

您需要用
$scope.$apply(function(){})
包装模型的更改(更改
$scope
上的属性),以便更新视图

var container = angular.module("AdminApp", []);

    container.controller("StatsController", function($scope) {

        var socket = io.connect();

        socket.on('message', function (msg) {
            console.log(msg);
            $scope.$apply(function() { $scope.frontEnd = msg; });
        });
    });
$apply()用于从外部以角度执行表达式 角度框架。(例如,从浏览器DOM事件, setTimeout、XHR或第三方库)。因为我们正在召唤 我们需要的角度框架执行适当的生命周期范围 异常处理,执行监视


从官方的角度来看,这可能是因为
socket.on('message',function(msg){..
没有角度知识。这是在角度之外发生的事情

如果你在角度之外做了什么,那么你必须告诉角度更新,因为有东西要更新

$scope.frontEnd=msg;

或者更优选地将其包装在
$timeout
中,如下所示:

$timeout(function() {
    $scope.frontEnd = msg;
});

下面是一个很好的解释,为什么
$timeout
更可取。

效果非常好。非常感谢:)帮了我一天。谢谢