Socket.IO消息不更新Angular变量

Cha*_*tla 6 javascript sockets node.js angularjs

我有一个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);
 });
});
Run Code Online (Sandbox Code Playgroud)

如所观察到的,它实质上发出了message存储在变量中的数据的事件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;
    });
});
Run Code Online (Sandbox Code Playgroud)

我现在面临一个奇怪的问题.当我编写以下代码片段进行打印时frontEnd,它不会显示.但是console.log(msg);工程和它向我展示了从变量发出的数据msg.

<body ng-app="AdminApp">

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

</body>
Run Code Online (Sandbox Code Playgroud)

谁能帮我吗?

Ste*_*fan 9

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

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; });
        });
    });
Run Code Online (Sandbox Code Playgroud)

$ apply()用于从角度框架外部以角度执行表达式.(例如,来自浏览器DOM事件,setTimeout,XHR或第三方库).因为我们正在调用角度框架,所以我们需要执行异常处理的适当范围生命周期,执行手表.

来自Angular官方文档