Angularjs 调用http get时获取$scope中的值,但在客户端代码完成后调用该值

Angularjs 调用http get时获取$scope中的值,但在客户端代码完成后调用该值,angularjs,Angularjs,在控制器页面中,即Expense.js $scope.getPagedDataAsync = function (pageSize, page) { $scope.largeLoad = todoService.initialize(); todoService.getDataAsync(); $scope.setPagingData($scope.largeLoad, page, pageSize);

在控制器页面中,即Expense.js

 $scope.getPagedDataAsync = function (pageSize, page) {

            $scope.largeLoad = todoService.initialize();
            todoService.getDataAsync();
            $scope.setPagingData($scope.largeLoad, page, pageSize);
            $scope.sortData = $scope.largeLoad;
            $scope.toDate = "";
            $scope.fromDate = "";

            //summary();


        };
上面的页面正在调用在services.js中创建的todoService

 var methods = {

            // Give a reference to the controller for the array 
            //  we will update asyncronously


 var todos = [];

            initialize: function () {
                return todos;
            },

 getDataAsync: function () {

                var deferred = $q.defer();

                // Define status code to error mapping


                $http({ 
                  method: "get", 
                  url: '/api/ExpenseWebApi/GetGridData', 
                  cache: false 
                 })
                 .success(function (largeLoad) {
                    todos.length = largeLoad.length;
                    for (var i = 0; i < todos.length; i++) {
                        todos[i] = largeLoad[i];
                    }

                    deferred.resolve(todos);

                })
                return deferred.promise;
            }

您正在异步获取数据,但其余代码将只执行

您应该重构以执行以下操作:

todoService.getDataAsync()
.then(function(todos){
  $scope.largeLoad = todos;
  $scope.setPagingData($scope.largeLoad, page, pageSize);
  $scope.sortData = $scope.largeLoad;
  $scope.toDate = "";
  $scope.fromDate = "";
});
这将保证您的代码将在异步调用完成后执行

作为一个小小的代码回顾说明。通过先将长度设置为0,然后结合使用unshift和apply将一个数组的元素复制到另一个数组中,可以避免将项目复制到数组中的循环

var target = [];
var source = ['Josh', 'Bob', 'Larry'];

//In case target has items already
target.length = 0;    

Array.prototype.unshift.apply(target, source);

console.log(target); // ['Josh', 'Bob', 'Larry']

在进行http调用后添加then将初始化作用域