视图/控制器不会使用 push() 函数刷新,使用 angularjs 中的 socket.io

The view/controller does not refresh with push() function using socket.io in angularjs

本文关键字:刷新 函数 使用 angularjs io socket 中的 控制器 push 视图      更新时间:2023-09-26

我正在尝试刷新我的角度应用程序的控制器以接收来自 socket.io 的对象。一切正常,除了当我使用 push 函数向变量添加新对象时视图不显示。这是我的代码。

控制器.js

app.controller('controller', function(){
var vm = this;
var socket = io.connect('http://localhost:3000');
//The variable that bends
vm.messages = [];
socket.on("addMsg", function(obj){
    vm.messages.push({user: obj.user, content: obj.content, color:obj.col});
});

});

查看翡翠

    ...
 body(ng-controller = "controller as con")
.messages
    p Messages:
    p(ng-repeat="array in con.messages") content: {{array.content}} , color: {{array.color}}

我的代码有什么问题?,目的是使用 ng-repeat显示 p 标签中的所有内容。

这个来自html5rocks文章angular-websocket的微小的Angular Factory socket服务将 socket.io 包装在角度范围内。它会自动$rootScope.$apply()

app.factory('socket', function ($rootScope) {
  var socket = io.connect();
  return {
    on: function (eventName, callback) {
      socket.on(eventName, function () {  
        var args = arguments;
        $rootScope.$apply(function () {
          callback.apply(socket, args);
        });
      });
    },
    emit: function (eventName, data, callback) {
      socket.emit(eventName, data, function () {
        var args = arguments;
        $rootScope.$apply(function () {
          if (callback) {
            callback.apply(socket, args);
          }
        });
      })
    }
  };
});

当我尝试更新socket.on回调中的角度范围变量时,我遇到了完全相同的问题。 正如@aw04在他的评论中提到的那样,解决方法是简单地调用$scope.$apply()