Javascript 以定期更新的方式存储和使用数据的最佳方法
我是Angular的新手,我正在尝试创建一个应用程序,每5分钟从动态生成的JSON文件中提取数据,并用新数据更新视图。JSON文件包含网站的所有数据,即滑块和事件列表的数据。我已经读到,全局数据可以存储在$rootScope中,也可以使用.service或.factory进行检索和服务。我尝试过不同的方法,但没有成功,我迷失了方向。定期从整个应用程序的api中提取数据、存储数据和使用数据的最佳方法是什么 目前我有以下代码:Javascript 以定期更新的方式存储和使用数据的最佳方法,javascript,angularjs,Javascript,Angularjs,我是Angular的新手,我正在尝试创建一个应用程序,每5分钟从动态生成的JSON文件中提取数据,并用新数据更新视图。JSON文件包含网站的所有数据,即滑块和事件列表的数据。我已经读到,全局数据可以存储在$rootScope中,也可以使用.service或.factory进行检索和服务。我尝试过不同的方法,但没有成功,我迷失了方向。定期从整个应用程序的api中提取数据、存储数据和使用数据的最佳方法是什么 目前我有以下代码: app.factory("Poller", function Polle
app.factory("Poller", function Poller($http, $timeout){
var data = {'slider' : [], 'activities' : []};
var getData = function(){
$http.get('http://example.com/json.php')
.then(function(r){
data = r.data;
});
$timeout(getData, 1000*60*5);
}
getData();
return{
data: data
}
});
app.controller('ListController', function(Poller){
this.activities = Poller.data.activities;
});
因此,这里的问题看起来像是在发出ajax请求的轮询器工厂中定义了函数getData,但没有将其绑定到工厂返回对象中的键 试着加上这个
return{
data: data,
getData: getData
}
然后删除返回块之前的getData
现在,我想根据应用程序的设置,如果要实现长轮询效果,应该将getData附加到始终存在的某个顶级控制器中的变量,以便可以使用$timeout定期调用getData
说到$timeout,您应该在getData之外提取$timeout,这样函数本身就可以发出ajax请求。这样的设计更加模块化、单一责任,如果您需要的话,它使工厂功能在应用程序的其他领域更可用
如果您想在每五分钟完成一次ajax请求后更新信息,您应该查看$broadcast和$rootScope,您基本上可以告诉您的整个Angular应用程序某个rootScope变量或服务已更改,它们将相应地更新。在调用getData函数的任何控制器中,都需要在ajax请求之后设置某种回调 我想你在找这样的东西: 看
此方法的问题是json文件保存其他控制器的数据。我想在服务中进行一次http调用,而不是通过控制器进行多次http调用。刚刚更新了我的答案。现在,服务只需每隔一段时间获取新数据,控制器就会更新他们正在侦听的特定值。这太棒了!不过我有一个问题。在ListController中,如果使用$scope.activities=newValue,则视图永远不会更新。但是,如果我设置var list=this。。。list.activities=newValue它确实有效。有什么想法吗?谢谢你迄今为止的帮助!我不太确定我是否理解您的代码,是否足以调试它。你能发布你的更新代码吗?我看到的一件事是,您必须将列表定义为$scope.list。然后可以执行$scope.list.activities=newValue;。如果变量不在$scope对象上,您将不知道如何更新UI
app.factory("Poller", function Poller($http, $interval){
var data = {
'newData': {
'one' : '',
'key' : ''
},
'fetchCount': 0
};
var getData = function() {
data.fetchCount += 1;
$http.get('http://echo.jsontest.com/key/value/one/two')
.then(function(response){
data.newData = response.data;
});
};
var loopGetData = function() {
$interval(getData, 5000);
};
loopGetData();
return{
data: data,
};
});
app.controller('ListController', function($scope, Poller){
$scope.activities = {'one' : '', 'key' : ''};
$scope.Initialize = function () {
$scope.$watch(function () { return Poller.data.newData; },
function(newValue, oldValue) {
if (newValue !== oldValue) {
$scope.activities = newValue;
}
});
};
$scope.Initialize();
});
app.controller('CountController', function($scope, Poller){
$scope.fetchCount = 0;
$scope.Initialize = function () {
$scope.$watch(function () { return Poller.data.fetchCount; },
function(newValue, oldValue) {
if (newValue !== oldValue) {
$scope.fetchCount = newValue;
}
});
};
$scope.Initialize();
});