Подтвердить что ты не робот

Чтение в JSON через Angular Служба ресурсов

Как я могу использовать angular-resources.js для чтения в файле JSON через службу?

Я работаю над очень простым приложением Angular для тестирования и просто пытаюсь читать данные из файла JSON прямо сейчас. Я помещаю этот код в службу, поэтому я могу более легко поменять его, когда мы перемещаем хранилище данных на основе сервера.

Мое объявление App и App.controller выглядит следующим образом:

'use strict';

// create module for custom directives
var App = angular.module('App', ['jsonService']);

// controller business logic
App.controller('AppCtrl', function AppCtrl($scope, JsonService) {
    console.log("marker 1");

    if (!$scope.jsonData) {
        console.log("marker 2");
        JsonService.getData(function (d) {
            console.log(d);
            $scope.jsonData = d;
            $scope.records = d.length;
        });
    } else {
        console.log("I have data already... " + $scope.jsonData);
    }

    console.log($scope.jsonData);
});

Мой JsonService определяется как следующий, на данный момент:

'use strict';

angular.module('jsonService', ['ngResource'])
.factory('JsonService', function($resource, $filter) {
    // define the remote service using Angular $resource module
    var service = $resource('/data/ProcessModeling-Resources.json', {});

    var JsonService = {
        // calls $resource.query() to retrieve the remote data.
        getData : function getData(callback) {
            console.log("marker 3");
            service.query(function (data) {
                console.log("marker 4");
            });
        }
    };

    return JsonService;
});

Выход консоли, который я получаю:

marker 1 app.js:8
marker 2 app.js:11
marker 3 services.js:13
undefined app.js:21
TypeError: Object #<Resource> has no method 'push'
    at copy (http://127.0.0.1:8000/lib/angular.js:556:21)
    at new Resource (http://127.0.0.1:8000/lib/angular-resource.js:330:9)
    at http://127.0.0.1:8000/lib/angular-resource.js:386:32
    at forEach (http://127.0.0.1:8000/lib/angular.js:117:20)
    at http://127.0.0.1:8000/lib/angular-resource.js:385:19
    at wrappedCallback (http://127.0.0.1:8000/lib/angular.js:6650:59)
    at http://127.0.0.1:8000/lib/angular.js:6687:26
    at Object.Scope.$eval (http://127.0.0.1:8000/lib/angular.js:7840:28)
    at Object.Scope.$digest (http://127.0.0.1:8000/lib/angular.js:7707:25)
    at Object.Scope.$apply (http://127.0.0.1:8000/lib/angular.js:7926:24) angular.js:5582

Я получаю свою ошибку, когда пытаюсь вызвать мой service.query(function (data) { }, который (если я правильно понимаю) должен потянуть мой файл JSON.

Я использовал приложение AngularJS Cats App в качестве примера для вытягивания данных.

4b9b3361

Ответ 1

Я буду следовать советам @pkozlowski и убедиться, что ответ представляет собой массив. Во всяком случае, вот пример, который загружает данные из файла JSON, аналогичные тому, что вы описываете в своих комментариях. Он использует ngResource и может помочь вам собрать вещи: http://plnkr.co/edit/Ofq7Md8udEnIhAPF1NgL?p=preview

Служба

angular.module('jsonService', ['ngResource'])
.factory('JsonService', function($resource) {
  return $resource('cats.json',{ }, {
    getData: {method:'GET', isArray: false}
  });
});

Обратите внимание, что для параметра isArray установлено значение false.

Ваше приложение и контроллер

var app = angular.module('app', ['jsonService']);

app.controller('ctrl', function($scope, JsonService){
  JsonService.getData(function(data){
    $scope.name = data.name;
    $scope.children = data.children;
  });
});

getData на самом деле не требуется, так как класс Ресурс дает вам полезные методы удобства, такие как get, вы можете просто сделать это

angular.module('jsonService', ['ngResource'])
.factory('JsonService', function($resource) {
  return $resource('cats.json');
});

app.controller('ctrl', function($scope, JsonService){
  JsonService.get(function(data){
    $scope.name = data.name;
    $scope.children = data.children;
  });
});