Переменная массива массы всегда показывает 0, но JSON от остальных показывает данные в угловом

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

Вопрос

Я использую Angularjs и Spring Service.это очень простой сценарий, но не знаю, каковы проблемы!

Это мой контроллер, где в нем возвращается массив Daya, определенный в Service.js.В следующем коде всегда возвращается консоль 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'}
    })
. Теперь служба отдыха, определенная в отзывах Method "/ NGDEMO / Web / Subs / Review /: Клавиша« Возвращает данные, как я вижу в Console Firefox.Но он не достигает контроллера, поэтому не может получить доступ к данным.Не могли бы вы помочь предположить, каково выпуск?

Я попробовал удалить isarray: true, но это бросает ошибку $ destition.push - это функция или что-то ошибка.

Пожалуйста, предложите

Это было полезно?

Решение

Проблема, которую вы сталкиваетесь, относятся к асинхронной природе генеракодицетагкода.Каждый раз, когда вы назначаете ресурсный запрос в какое-либо свойство области применения, вы фактически назначаете какой-то пустой объект, который будет заполнен после того, как придет актуальный ответ.Поэтому вы не можете получить доступ к данным непосредственно синхронным образом.Существует несколько разных способов, которые позволяют вам получить доступ к данным после этого.Вот два возможных способа (используя функцию обратного вызова в качестве аргумента запроса и $resource):

<Сильный> 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'}
      })
    }
  }]);
.

prounker: http://plnkr.cl/edit/vy52x0ljkgsl4neseNuy?p=pReview

Другие советы

Вы должны ждать вашего запроса, чтобы закончить, прежде чем выходить из результата.Из угловые документы :

Важно осознавать, что вызывает метод объекта ресурса $ немедленно возвращает пустую ссылку (объект или массив в зависимости от isarray).Как только данные возвращаются с сервера существующие Ссылка заполняется фактическими данными.

Так что вы можете сделать что-то вроде этого

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top