0

設定している関数の外で totalResults を使用するにはどうすればよいですか? 私はそれを行う方法に頭を悩ませることはできません。データベースから収集したtotalResultsを使用し、別の関数で使用してページ数を計算する必要があります。すべてのデータをクライアントにロードしないようにこれを行いますが、データベース テーブル内の行の総数を知る必要があります。

私のjsonは次のようになります:

Object {total: 778, animals: Array[20]}

角度:

var app = angular.module('app', []);

app.controller('AnimalController', ['$scope', 'animalSrc', function($scope, animalSrc)
{
    $scope.animals = [];

    var skip = 0;
    var take = 20;
    var totalResults = null;
    //$scope.totalResults = null;

    $scope.list = function()
    {
        animalSrc.getAll(skip, take, function(data) {
            $scope.animals = $scope.animals.concat(data.animals);

            // I need to be able to use this outside of function ($scope.list)
            totalResults = data.total;
            //$scope.totalResults = data.total;
        });
    };

    $scope.showMore = function()
    {
        skip += 20;
        $scope.list();
    };

    $scope.hasMore = function()
    {
        //
    };

    // Outputs null, should be the total rows from the $http request
    console.log(totalResults); 
}]);

app.factory('animalSrc', ['$http', function($http)
{
    // Private //

    return {
        getAll: function(skip, take, callback)
        {
            $http({
                method: 'GET',
                url: 'url' + skip + '/' + take
            }).
            success(function(data) {
                callback(data);
            }).
            error(function(data) {
                console.log('error: ' + data);
            });
        }
    };
}]);
4

2 に答える 2

1

非同期的に考え始める必要があります。$http が返されて totalResults が設定される前に、console.log が呼び出されます。したがって、totalResults は常に null になります。

console.log を実行する前に $http 呼び出しを終了できるように、console.log への呼び出しを遅らせる何らかの方法を見つける必要があります。これを行う 1 つの方法は、console.log 呼び出しをコールバック関数内に配置して、$http の成功後に確実に呼び出されるようにすることです。

これを行うためのよりエレガントな方法は、promise を使用することです。angular.js は、Promise ライブラリである Q に似た $q を実装しています。

http://docs.angularjs.org/api/ng.$q

getAll でコールバック関数を作成する代わりに、promise を返します。$http の成功の中で、データを使用して promise を解決します。次に、コントローラーには、promise が解決されたときに呼び出される関数があります。Promise は、受け渡すことができ、非同期コードのフローをブロックせずに制御できるため、便利です。

于 2013-04-14T00:45:14.120 に答える