【问题标题】:Resource expecting an array but it's getting an object with an array inside. Angularjs + resource资源需要一个数组,但它正在获取一个内部带有数组的对象。 Angularjs + 资源
【发布时间】:2014-06-03 18:13:11
【问题描述】:

我是 Angularjs 的新手,有一个疑问。我正在使用 $resource 以这种方式使用 Rest Web 服务:

providersApp.factory('providersSrvc', function ($resource) {
    return {
        getData: function () {
            return $resource('http://devfz.azurewebsites.net/api/providers', {}, {
                query: { method: 'GET' }
            });
        }
    }
});

这是我的控制器:

providersApp.controller('ProvidersController',
    function ProvidersController($scope, providersSrvc) {
        $scope.providers = providersSrvc.getData().query();
    });

这个 Rest URL 正在返回一个 JSON 对象,其中包含一个数组(如果我错了,请纠正我):

{"$id":"1","$values":[{"$id":"2","Id":1,"Name":"Diagnose","Category":null,"Address":null,"Services":null},{"$id":"3","Id":2,"Name":"Hospital São lucas","Category":null,"Address":null,"Services":null},{"$id":"4","Id":3,"Name":"Hospital Primavera","Category":null,"Address":null,"Services":null}]}

我找到了一种像这样迭代它的方法:

provider in providers.$values

我的问题是:这被认为是迭代它的好方法吗?我在互联网上找到的所有示例似乎都返回 JSON 数组,而不是像我这样的 JSON 对象内的数组。我的 Restful JSON 返回有什么问题吗?有没有更好的方法来完成这一切?

非常感谢您的帮助!

【问题讨论】:

  • 你想要'query': {method:'GET', isArray:true},
  • 查看Angular phonecat tutorial 的示例。 docs for $resource 也提到了isArray,但不多。
  • 如果我使用“isArray:true”,我得到一个错误,说它需要一个数组,但得到一个对象。这个对象里面有一个数组。
  • 哦,我明白了。抱歉,我没有对您链接的 api 给予足够的关注。服务是其 API 由编写服务的开发人员定义的对象,并且该服务定义了一个带有 $id$values 字段的对象......因此无法直接从中获取数组。你所拥有的解析很好,但我建议(如果你打算在控制器/模板中使用 $values 作为数组)将它分配给回调中的 $scope 变量。
  • 非常感谢,克伦尼。我明白你的意思:)

标签: arrays json angularjs


【解决方案1】:

您的退货或代码没有任何问题。我怀疑服务中的$id 值对您来说与提供者内容的实际数组一样有用,因此我建议为数组提供自己的范围变量,以便从模板访问它更清晰。如果你必须做清理或任何事情,你也可以在回调中做。

foo.js

providersApp.controller('ProvidersController',
    function ProvidersController($scope, providersSrvc) {
        $scope.providers = providersSrvc.getData().query().then(function(data) {
            return data.$values.filter(function (provider) {
                return (provider.Category === null);
            }
        }
    });

foo.html

<ul>
  <li ng-repeat="provider in providers">
    {{provider.Name}}
    {{provider.Diagnose}}
    {{provider.Category}}
    {{provider.Address}}
    {{provider.Services}}
  </li>
</ul>

作为 P.S:"provider" 是 Angular 中的一个概念,因此您可能想考虑将您的域语言重命名为“医院”或“护理提供者”之类的名称,以避免混淆 :)

【讨论】:

  • 很高兴 answer + cmets 的组合可以帮助解决问题! :) 如果您满意,请考虑接受此答案。
  • 完成!我不能投票,因为我没有足够的声誉:D
  • 没关系。现在可能有类似问题的人可以看到这个问题有一个选择的答案,并且他们可能能够在这里找到解决方案。毕竟这是一个 QnA 网站!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-20
  • 1970-01-01
  • 2022-11-23
  • 1970-01-01
  • 2018-10-18
  • 1970-01-01
相关资源
最近更新 更多