Ámbito de aplicación de la matriz de varible siempre muestra 0 pero JSON desde el reposo muestra los datos en angular

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

Pregunta

Estoy usando angularjs y la primavera servicio rest.es un escenario muy sencillo, pero no sé cuál es el problema!

Este es mi controlador en donde se devuelve la matriz de daya definido en service.js.En el código de abajo de la consola, devuelve 0 siempre.

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

ahora, el resto de servicios definidas en los comentarios método"/ngdemo/web/posts//revisión:clave" devuelve los datos como puedo ver en Firefox consola método GET.pero no llegar a la controladora, por lo tanto no podrán acceder a los datos.Podría usted por favor ayuda lo que sugiere cuál es el problema?

He probado la eliminación de isArray:cierto, pero se tira error $destino.push es nt una función o algo de error.

Por favor, sugiera

¿Fue útil?

Solución

El problema que se enfrenta es pertinente a la naturaleza asíncrona de $resource.Cada vez que asigne los recursos de la consulta a alguna propiedad de alcance, en realidad asignar algún tipo de objeto vacío que se llenará una vez que la respuesta vendrá.Por lo tanto, usted no puede acceder a los datos directamente en forma sincrónica.Hay varias maneras diferentes que permiten acceder a los datos una vez que se ha llegado.Aquí hay dos posibles maneras (usando la función de devolución de llamada como argumento de consulta y $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

Otros consejos

Tienes que esperar a que termine su consulta antes de cerrar el resultado.De la documentos angulares :

Es importante darse cuenta de que invocando un método de objeto de recursos $ Inmediatamente devuelve una referencia vacía (objeto o matriz dependiendo de Isarray).Una vez que los datos se devuelven desde el servidor el existente La referencia se rellena con los datos reales.

para que puedas hacer algo como este

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top