2

AngularJSを使用してシングルページアプリを開発しています。現在、セットアップが行われているため、5秒ごとにDBが呼び出され、クライアントモデルが更新されます。タイムスタンプで物事をずらしたかった。したがって、DBからすべてをプルするのではなく、最後の呼び出しよりも新しい場合に追加されたすべてをプルします。(帯域幅などを節約します)。しかし、それは私には意味がありません

Angular Controller

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桁の整数を表示します。しかし、私のDBでは、phpのtime関数を使用して10桁のintが表示されます。

time()

これらは矛盾しますか?

4

2 に答える 2

10

配列自体を連結する必要があります(現在、初期配列をハッシュオブジェクトと連結しています)。

$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 に答える