スコープ配列変数は常に0を示しますが、RESTからのJSONは角度内のデータを示しています
-
21-12-2019 - |
質問
AngularJSとSpring Restサービスを使用しています。非常に単純なシナリオであるが、問題はわからない!
これは私のコントローラです。ここで、Service.jsで定義されているDAYAの配列を返します。以下のコードで、コンソールは常に0を返します。
controller.js
$scope.allreviews = PostFactory.reviews.query({key: reviewId});
console.log('read more' + $scope.allreviews.length);
.
services.js
reviews: $resource('/ngdemo/web/posts/review/:key', {}, {
query: {method: 'GET', isArray: true, params: {key: '@key'} },
create: {method: 'POST'}
})
.
今すぐレビューメソッド "/ ngdemo / web / posts / review /:key"で定義されているRESTサービス/:key "は、Firefoxコンソールの取得方法で見ることができます。しかし、それはコントローラに到達しません。したがって、データにアクセスできません。問題を提案するのを助けてもらえますか?
ISARRAYの取り外しを試みました:trueですが、エラー$ DESTINTY.PUSHはNT関数または何かエラーです。
をお勧めしてください
解決
あなたが直面している問題は、$resource
の非同期性に関連しています。範囲の一部のプロパティにリソースクエリを割り当てるたびに、実際には、関連する応答が発生すると、実際には特定の空のオブジェクトが割り当てられます。したがって、同期的に直接データにアクセスすることはできません。それが来たらデータにアクセスできるようにするさまざまな方法がいくつかあります。ここに2つの可能な方法があります(クエリと$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'}
})
}
}]);
.
プランク: http://plnkr.co/edit/vy52x0ljkgsl4nesenuy ?p=previewed/a.>
他のヒント
結果をログアウトする前に、クエリが終了するのを待つ必要があります。 angular docs
$ Resource Objectメソッドを呼び出すことを実現することが重要です すぐに空の参照(オブジェクトまたは配列に応じてアレイ)を返します。 イシアレイ)。データがサーバーから既存のサーバーから返されると 基準に実際のデータが入力されています。
だからあなたはこのようなことをすることができます
$scope.allreviews = PostFactory.reviews.query({key: reviewId} function() {
console.log('read more' + $scope.allreviews.length);
});
.