1

在 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(),它返回Error: $apply already in progress,因为它似乎 $http 已经在“内部”Angular。

任何和所有的想法表示赞赏。谢谢。

4

1 回答 1

0

在某些情况下,您将需要使用$scope.$apply();

尝试执行:

$scope.$apply(function() {
  $scope.myEvents = newMyEvents;
}

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

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

有关 $apply 以及如何防止错误的更多信息

于 2013-05-17T07:54:15.167 回答