我有这个site,它基本上是一个名为“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脚本,即使数据不同,绑定也不会更新。我认为这会自动起作用,因为promises在内部调用$ apply作用于范围,但显然它没有。因此我尝试手动调用$ apply:
$scope.$apply(function() {
$scope.ServerData = data;
}
但这也没有用,因为现在它说“$ digest已经在进行中”。奇怪的是,我甚至没有第一次尝试工作,它曾经没有$ apply。在对摘要问题进行一些研究之后,其中一个解决方案建议尝试以下方法:
$scope.$$phase == "$digest" || $scope.$apply(function() {
$scope.ServerData = data;
}
但是这也没有用,因为$ scope。$$阶段始终设置为“$ digest”,无论是初始数据加载还是第n次。
答案 0 :(得分:1)
您在ServerDataFactory中创建了一个deferred
对象,因此每次调用getServerDataWithQ
都会尝试解析相同的延迟,但延迟只能解析一次。所以这是一个简单的修复:将var deferred = $q.defer();
移到getServerDataWithQ()
。