2

我正在使用 AngularJS 开发单页应用程序。目前我已经进行了设置,因此每 5 秒调用一次数据库以更新客户端模型。我想用时间戳错开事情。因此,它不会从数据库中提取所有内容,而只会提取比上次调用更新时添加的所有内容。(节省带宽等)。但这对我来说没有意义

角度控制器

var timestamp = '';
function NewsListCtrl($scope, $http, $timeout) { 
    $scope.news = [];
    $scope.newsRequest = function() {

        $http.get('/ci/index.php/news/get_news_ajax/' + timestamp).success(function(data) {
            timestamp = $.now();

            $scope.news = $scope.news.concat(data);
        });
    };

    $scope.newsRequest();
    setInterval(function(){
        $scope.$apply(function(){
            $scope.newsRequest();
        });
    }, 5000);
}

上面的代码不会在页面上打印任何内容。第一个请求显示对象中的数据。但后续请求(带有时间戳)显示空对象。所以至少第一个请求应该打印出来。

初始请求中的数据样本

{"new":[{"id":"181","title":"not gonna work","slug":"not-gonna-work","time":"1363374669","text":"asdfs","deletetime":null}]}

当我删除

$scope.news = [];

然后我得到返回的错误,说它是未定义的。

任何人都能够阐明实现这一目标的正确方法吗?

编辑:

根据答案,我已将代码更新为:

var timestamp = '';
function NewsListCtrl($scope, $http, $timeout) { 
    $scope.news = [];
    $scope.newsRequest = function(){
        $http.get('/ci/index.php/news/get_news_ajax/' + timestamp).success(function(data) {
            timestamp = $.now();
            $scope.news = $scope.news.concat(data.new);   
    });
};
$scope.newsRequest();
setInterval(function(){
    $scope.$apply(function(){
           $scope.newsRequest();
    });
}, 5000);

所以现在数据仍然显示在页面上。但它实际上不再从模型中填充新数据。不确定这是否是逻辑问题。我在用着

timestamp = $.now(); 

设置当前时间。它显示一个 13 位整数。但是在我的数据库中,它显示了一个带有 php 时间函数的 10 位整数。

time()

这些冲突吗?

4

2 回答 2

10

You should concat the array itself (now you are concatenating initial array with hash object):

$scope.news = $scope.news.concat(data['new']);
/* data['new'] because your request returns `{new: []}`, consider changing it to `{news:[]}` */
于 2013-03-18T20:40:02.067 回答
2

除了德米特里的回答,使用

if ($scope.news == null) {
    $scope.news = [];
}

回调里面。

或者,移动$scope.news = []回调的外部。

更新您的新问题:

$.now()以毫秒为单位。Unix 时间以秒为单位(date +%s)(我拒绝承认 PHP :P

于 2013-03-18T20:50:17.637 回答