0

基本的に「Armagetron Advanced」と呼ばれる小さなゲームのサーバーモニターであるこのサイトがあります。このサーバー モニターは、サイトに戻るたびに json をリロードすることになっています。

私のアプリのコードは次のとおりです。

controller('ServerBrowserController', function($scope, ServerDataFactory) {

    $scope.loadServers = function() {
        $scope.ServerData = ServerDataFactory.getServerDataWithQ();
        //promise.then(function(data) {
            //$scope.$apply(function() {
                //$scope.ServerData = data;
            //});
        //});
    }        

    document.addEventListener(visibilityChange, function() {
        if(document[hidden] == false) {
            $scope.loadServers();
        }
    }, false);

    $scope.loadServers();
}).
factory('ServerDataFactory', function($http, $q) {

    var deferred = $q.defer();

    var factory = {};

    factory.getServerDataWithQ = function() {
        $http({ method: 'GET', url: '/new/app/serverxml_to_json.php' }).
            success(function(data) {
                deferred.resolve(data);
        }).
            error(function(data) {
                alert("Couldn't load xml data.");
        });

        return deferred.promise;

    };

    return factory;
}).

http クエリは最初は正常に機能しますが、すぐにサイトに戻って php スクリプトを再度クエリすると、データが異なっていてもバインディングが更新されません。これは、プロミスがスコープで $apply を内部的に呼び出すため、自動的に機能すると思っていましたが、明らかにそうではありません。したがって、手動で $apply を呼び出そうとしました:

  $scope.$apply(function() {
      $scope.ServerData = data;
  }

しかし、「$digest [is] は既に進行中」と表示されたため、これも機能しませんでした。奇妙なことに、$apply なしで行っていた最初の試行でさえ作業しませんでした。ダイジェストの問題についていくつかの調査を行った後、解決策の1つが次のことを試すことを提案しました。

$scope.$$phase == "$digest" || $scope.$apply(function() {
    $scope.ServerData = data;
}

しかし、$scope.$$phase が最初のデータ読み込みか n 回目かに関係なく、常に "$digest" に設定されていたため、これも機能しませんでした。

4

1 に答える 1

1

deferredServerDataFactory でオブジェクトを作成するため、 を呼び出すたびに同じgetServerDataWithQdeferredを解決しようとしますが、deferred は 1 回しか解決できません。したがって、それは簡単な修正です: に移動します。var deferred = $q.defer();getServerDataWithQ()

于 2013-06-13T15:38:09.860 に答える