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 的情况下这样做。在对摘要问题进行了一些研究之后,其中一个解决方案建议尝试以下方法:

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

但这也不起作用,因为 $scope.$$phase 始终设置为“$digest”,无论是初始数据加载还是第 n 次。

4

1 回答 1

1

您在 ServerDataFactory 中创建一个deferred对象,因此每次调用都会getServerDataWithQ尝试解析相同的延迟,但延迟只能解决一次。所以这是一个简单的修复:移动var deferred = $q.defer();getServerDataWithQ().

于 2013-06-13T15:38:09.860 回答