Angularjs 调用http get时获取$scope中的值,但在客户端代码完成后调用该值
在控制器页面中,即Expense.jsAngularjs 调用http get时获取$scope中的值,但在客户端代码完成后调用该值,angularjs,Angularjs,在控制器页面中,即Expense.js $scope.getPagedDataAsync = function (pageSize, page) { $scope.largeLoad = todoService.initialize(); todoService.getDataAsync(); $scope.setPagingData($scope.largeLoad, page, pageSize);
$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将初始化作用域