La variable du tableau Scope affiche toujours 0 mais JSON du reste affiche les données en angulaire

StackOverflow https://stackoverflow.com//questions/23019014

Question

J'utilise Angularjs et le service Spring Rest.c'est un scénario très simple mais je ne sais pas quel est le problème !

C'est mon contrôleur où il renvoie un tableau de daya défini dans service.js.Dans le code ci-dessous, la console renvoie toujours 0.

contrôleur.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'}
    })

maintenant, le service de repos défini dans la méthode des critiques "/ngdemo/web/posts/review/:key" renvoie des données comme je peux le voir dans la méthode GET de la console Firefox.mais il n'atteint pas le contrôleur et ne peut donc pas accéder aux données.Pourriez-vous s'il vous plaît aider à suggérer quel est le problème ?

J'ai essayé de supprimer isArray :vrai mais cela renvoie une erreur $destination.push n'est pas une fonction ou une erreur quelque chose.

Veuillez suggérer

Était-ce utile?

La solution

Le problème auquel vous êtes confronté est lié à la nature asynchrone de $resource.Chaque fois que vous attribuez une requête de ressource à une propriété de portée, vous attribuez en fait une sorte d'objet vide qui sera rempli une fois la réponse pertinente reçue.Vous ne pouvez donc pas accéder directement aux données de manière synchrone.Il existe plusieurs manières différentes qui vous permettent d'accéder aux données une fois qu'elles sont disponibles.Voici deux manières possibles (en utilisant la fonction de rappel comme argument de requête et $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'}
      })
    }
  }]);

Plunker : http://plnkr.co/edit/vy52X0lJkGSL4neSeNUy?p=preview

Autres conseils

Vous devez attendre que votre requête soit terminée avant de décomposer le résultat.Du Documents angulaires :

Il est important de réaliser que invoquer une méthode d'objet $ de ressource retourne immédiatement une référence vide (objet ou tableau en fonction de isarray).Une fois que les données sont renvoyées du serveur, les La référence est remplie avec les données réelles.

Pour que vous puissiez faire quelque chose comme ça

$scope.allreviews = PostFactory.reviews.query({key: reviewId} function() {
    console.log('read more' + $scope.allreviews.length);
});

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top