Javascript AngularJS轮询$http和$timeout不更新视图

Javascript AngularJS轮询$http和$timeout不更新视图,javascript,angularjs,Javascript,Angularjs,在AngularJS项目中,我能够通过调用$scope.loadEvent显示事件列表,但在使用$http和$timeout轮询服务器时无法更新视图。我可以看到正在进行/接收正确的$http调用和响应 控制器的压缩版本: function EventsCtrl ($scope, $http, $timeout) { $scope.myEvents = new Array(); var newMyEvents = new Array(); $scope.loadEvent = fu

在AngularJS项目中,我能够通过调用$scope.loadEvent显示事件列表,但在使用$http和$timeout轮询服务器时无法更新视图。我可以看到正在进行/接收正确的$http调用和响应

控制器的压缩版本:

function EventsCtrl ($scope, $http, $timeout) {

  $scope.myEvents = new Array();
  var newMyEvents = new Array();

  $scope.loadEvent = function(eventId) {
    $http.get('http...').success(function(result) {
        $scope.myEvents.push(result.data);
    });
  }

  $scope.polling = function () {
      var poller = function() {
          newMyEvents = [];
          for(var i=0; i< $scope.myEvents.length; i++) {
              $http.get('http...').success(function(result) {
                  newMyEvents.push(result.data);
              });
          }
          $timeout(poller, 2000);
      }
      $scope.myEvents = newMyEvents;
      poller();
  }
}
以及以下观点:

<div ng-controller="EventsCtrl" ng-init="polling()">
我尝试了$scope.$apply,它返回错误:$apply已经在进行中,因为$http似乎已经在内部


感谢您的任何想法。谢谢。

在某些情况下,您需要使用$scope。$apply

尝试执行:

$scope.$apply(function() {
  $scope.myEvents = newMyEvents;
}
编辑 我完全误解了正在发生的事情。问题是,您正在异步触发所有这些查询,因此无法知道每个查询何时完成。另外,$timeout自动执行$scope.$apply。如果您想控制何时实际应用$apply,可以改用setTimeout

也许您可以在最后一个$http请求的回调中执行$scope.myEvents=newMyEvents,但您不能100%保证它实际上会最后获取数据。最好的方法是对后端执行一个调用,为您获取所有资源,以便您可以直接更新.success函数中的变量。如果这是可以实现的


您可能必须使用“以前尝试过”并出现错误:$apply已在进行中,可能是因为我已经在使用$http。您使用的是angular的1.1.X版本吗?我遇到过一些超时/间隔不触发的问题。尝试1.0.X发行版系列。如上所述,出现错误:$apply已在进行中。此外,我无法通过移动$timeout和$scope.myEvents分配来发送和接收轮询消息。原始问题中发布的代码能够获得正确的消息和频率,但不会生成更新的视图。是否可以在$http成功后仅更新$scope.myEvents?