Frage

Ich verwende AngularJS und Spring Rest Service.Es ist ein sehr einfaches Szenario, aber ich weiß nicht, woran es liegt!

Dies ist mein Controller, der ein in service.js definiertes Array von Daya zurückgibt.Im folgenden Code gibt die Konsole immer 0 zurück.

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'}
    })

Jetzt gibt der in der Rezensionsmethode „/ngdemo/web/posts/review/:key“ definierte Restdienst Daten zurück, wie ich in der GET-Methode der Firefox-Konsole sehen kann.aber es erreicht den Controller nicht und kann daher nicht auf die Daten zugreifen.Könnten Sie uns bitte helfen und vorschlagen, wo das Problem liegt?

Ich habe versucht, isArray zu entfernen:stimmt, aber es wird der Fehler „$destination.push ist keine Funktion“ oder ein anderer Fehler ausgegeben.

Bitte vorschlagen

War es hilfreich?

Lösung

Das Problem, mit dem Sie konfrontiert sind, ist für die asynchrone Natur von relevant $resource.Jedes Mal, wenn Sie einer Bereichseigenschaft eine Ressourcenabfrage zuweisen, weisen Sie tatsächlich eine Art leeres Objekt zu, das aufgefüllt wird, sobald eine relevante Antwort eintrifft.Daher können Sie nicht direkt und synchron auf Daten zugreifen.Es gibt verschiedene Möglichkeiten, auf die Daten zuzugreifen, sobald sie eingegangen sind.Hier sind zwei Möglichkeiten (Verwendung der Callback-Funktion als Argument der Abfrage und $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

Andere Tipps

Sie müssen warten, bis Ihre Anfrage abgeschlossen ist, bevor Sie das Ergebnis anmelden.Von der Winkel docs :

Es ist wichtig, dass das Aufrufen einer $ Ressourcenobjektmethode aufgerufen wird Gibt sofort eine leere Referenz zurück (Object oder Array in Abhängigkeit von Isarray).Sobald die Daten vom Server von dem Server zurückgegeben werden Die Referenz ist mit den tatsächlichen Daten aufgefüllt.

Sie können also so etwas tun

generasacodicetagpre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top