范围数组变量总是显示0,但来自rest的JSON以角度显示数据
-
21-12-2019 - |
题
我正在使用angularjs和spring rest服务。这是一个非常简单的场景,但不知道问题是什么!
这是我的控制器,其中返回服务中定义的daya数组。js的。在下面的代码中,控制台始终返回0。
控制器。js的
$scope.allreviews = PostFactory.reviews.query({key: reviewId});
console.log('read more' + $scope.allreviews.length);
服务。js的
reviews: $resource('/ngdemo/web/posts/review/:key', {}, {
query: {method: 'GET', isArray: true, params: {key: '@key'} },
create: {method: 'POST'}
})
现在,reviews方法"/ngdemo/web/posts/review/:key"中定义的rest服务返回数据,正如我在Firefox控制台GET方法中看到的那样。但它没有到达控制器,因此无法访问数据。你能帮我提一下问题是什么吗?
我尝试删除isArray:true,但它会抛出错误$destination。推送是一个函数或错误的东西。
请建议
解决方案
您所面临的问题与 $resource
.每次将资源查询分配给范围的某个属性时,实际上都会分配某种空对象,一旦相关响应到来,这些对象将被填充。因此,您无法以同步方式直接访问数据。有几种不同的方法可以让您在数据到来后访问数据。这里有两种可能的方法(使用回调函数作为查询的参数和 $scope.$watch()
):
JavaScript的
angular.module('app',['ngResource']).
controller('PostController',['$scope', 'PostFactory', function($scope, PostFactory) {
var reviewId = 'post.json';
$scope.allreviews = PostFactory.reviews.query({key: reviewId}, function(allreviews) {
console.log('(callback) read more ' + $scope.allreviews.length); // <= will log correct length
});
console.log('read more ' + $scope.allreviews.length); // <= will always log 0
$scope.$watch('allreviews.length', function(length) {
if(length) { // <= first time length is changed from undefined to 0
console.log('(watch) read more ' + $scope.allreviews.length); // <= will log correct length
}
});
}]).
factory('PostFactory', ['$resource', function($resource) {
return {
reviews: $resource(':key', {}, {
query: {method: 'GET', isArray: true, params: {key: '@key'} },
create: {method: 'POST'}
})
}
}]);
其他提示
您必须等待您的查询在注销结果之前完成。来自 Angular文档:
重要的是要认识到调用$资源对象方法 立即返回一个空引用(取决于的对象或数组) Isarray)。从服务器返回数据后,现有数据 用实际数据填充引用。
所以你可以做这样的事情
$scope.allreviews = PostFactory.reviews.query({key: reviewId} function() {
console.log('read more' + $scope.allreviews.length);
});
. 不隶属于 StackOverflow