【问题标题】:Reading in JSON through Angular Resources Service通过 Angular 资源服务读取 JSON
【发布时间】:2012-11-30 18:08:28
【问题描述】:

如何使用angular-resources.js 通过服务读取 JSON 文件?

我正在开发一个非常基本的 Angular 应用程序以用于测试目的,并且现在正试图从 JSON 文件中读取数据。我将此代码放在服务中,以便在移动基于服务器的数据存储时更轻松地将其换出。

我的AppApp.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's $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 作为拉取数据的示例。

【问题讨论】:

  • 我推测你文件中的数据不是query()方法要求的数组。
  • data 是一个object。它有两个字段:{'name': 'Resources', 'children': [ ... ] }。里面有一个数组……那会引起我的痛苦吗?
  • 是的,响应需要是一个顶级数组,而不是包裹在对象中。

标签: javascript json angularjs


【解决方案1】:

我会遵循@pkozlowski 的建议并确保响应是一个数组。无论如何,这是一个从 JSON 文件加载数据的示例,类似于您在 cmets 中描述的内容。它使用 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 实际上是不需要的,因为 Resource 类为您提供了一些有用的便捷方法,例如 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;
  });
});

【讨论】:

  • 谢谢@jm-。我仍然花了一点时间才弄清楚,但我明白了!我仍然想知道 - getquery 是否相同,除了 query 需要一个数组,而 get 不需要?
  • 它们在某种意义上是相似的,都发出GET请求,但你get一个资源{}query多个资源[{},{}]
  • 完美;我现在明白了!谢谢!
猜你喜欢
  • 2018-12-13
  • 2016-10-09
  • 2014-02-19
  • 2021-01-27
  • 1970-01-01
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多