Domanda

Sto usando angolari e servizio di riposo primaverile.È uno scenario molto semplice ma non sai qual è il problema!

Questo è il mio controller in cui in esso restituisce la matrice di Daya definita in Service.js.Nel seguente codice, la console restituisce 0 sempre.

controller.js

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

Servizi.js

reviews: $resource('/ngdemo/web/posts/review/:key', {}, {
        query: {method: 'GET', isArray: true, params: {key: '@key'} },
        create: {method: 'POST'}
    })
.

Ora, il servizio di riposo definito in Review Method "/ NGDEMO / Web / Posts / Review /: Key" restituisce i dati come posso vedere in Firefox Console Get Metodo.Ma non raggiunge il controller, quindi non può accedere ai dati.Potresti aiutare a suggerire qual è il problema?

Ho provato a rimuovere Isarray: True ma getta errori $ Destination.push è una funzione NT o qualcosa di errore.

Si prega di suggerire

È stato utile?

Soluzione

Il problema che si sta affronta è rilevante per la natura asincrona del $resource.Ogni volta che assegni una query di risorse ad alcuni divisioni di scope, in realtà assegni un tipo di oggetto vuoto che verrà popolato una volta che la risposta rilevante verrà.Pertanto non è possibile accedere ai dati direttamente in modo sincrono.Esistono diversi modi che ti consentono di accedere ai dati una volta che è arrivato.Ecco due modi possibili (utilizzando la funzione di callback come argomento di query e $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

Altri suggerimenti

Devi attendere che la tua query finisca prima di disconnettersi il risultato.Da Documenti angolari :

.

È importante rendersi conto che invocando un metodo di oggetto $ risorsa restituisce immediatamente un riferimento vuoto (oggetto o array a seconda di Isarray).Una volta che i dati vengono restituiti dal server l'esistente Il riferimento è popolato con i dati effettivi.

Quindi potresti fare qualcosa come questo

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top