Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 以定期更新的方式存储和使用数据的最佳方法_Javascript_Angularjs - Fatal编程技术网

Javascript 以定期更新的方式存储和使用数据的最佳方法

Javascript 以定期更新的方式存储和使用数据的最佳方法,javascript,angularjs,Javascript,Angularjs,我是Angular的新手,我正在尝试创建一个应用程序,每5分钟从动态生成的JSON文件中提取数据,并用新数据更新视图。JSON文件包含网站的所有数据,即滑块和事件列表的数据。我已经读到,全局数据可以存储在$rootScope中,也可以使用.service或.factory进行检索和服务。我尝试过不同的方法,但没有成功,我迷失了方向。定期从整个应用程序的api中提取数据、存储数据和使用数据的最佳方法是什么 目前我有以下代码: app.factory("Poller", function Polle

我是Angular的新手,我正在尝试创建一个应用程序,每5分钟从动态生成的JSON文件中提取数据,并用新数据更新视图。JSON文件包含网站的所有数据,即滑块和事件列表的数据。我已经读到,全局数据可以存储在$rootScope中,也可以使用.service或.factory进行检索和服务。我尝试过不同的方法,但没有成功,我迷失了方向。定期从整个应用程序的api中提取数据、存储数据和使用数据的最佳方法是什么

目前我有以下代码:

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();
});