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()">

$http がすでに Angular の「内部」にあるように見えるため$scope.$apply()、 を試しました。Error: $apply already in progress

ありとあらゆる考えに感謝します。ありがとう。

4

1 に答える 1

0

場合によっては、使用する必要があります$scope.$apply();

実行してみてください:

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

編集 何が起こっているのかを完全に誤解しました。問題は、これらのクエリをすべて非同期で起動しているため、それぞれのクエリがいつ終了するかを知る方法がないことです。また、$timeout は自動的に $scope.$apply を実行します。実際にいつ $apply を適用するかを制御したい場合は、setTimeout()代わりに使用できます。

おそらく、最後の $http リクエストのコールバック内で実行できます$scope.myEvents = newMyEvents(実際に最後にデータを取得する 100% の保証はありません)。.success最善の方法は、関数内の変数を直接更新できるように、すべてのリソースをフェッチするバックエンドへの呼び出しを 1 回実行することです。(それが達成可能な場合)

$apply とエラーを回避する方法の詳細

于 2013-05-17T07:54:15.167 に答える