1

我正在尝试使用 ngResource 来使用 firebase rest API。此 API 使用稍微不同的 URL 来检索集合和单个记录。例如,我有一个可以访问的集合:

https://angular-resource-test.firebaseIO.com/systems.json

但是,如果我想访问我使用的单个系统:

https://angular-resource-test.firebaseIO.com/systems/1.json

如何在资源声明中为此指定基于参数的 URL?

通常我会做类似的事情

app.factory('System', ['$resource', function($resource) {
  var System = $resource(
    'https://angular-resource-test.firebaseIO.com/systems/:id.json',
    {id: "@id"},
    {update: {method: "PUT"}}
  );
  return System;
}]);

但是集合失败了,因为它缺少结尾的 .json。或者,当我指定适用于集合的 URL 时,选择单个行的情况会失败。有关示例,请参见此 jsfiddle:

http://jsfiddle.net/D5E6w/15/

4

3 回答 3

1

有两种方法可以在资源中发送 HTTP GET。

  • get : 期望收到一个对象
  • 查询:期望收到一个数组

您的 api 不是很安静,因此,您将需要 2 个资源来做您想做的事情,因为它们使用不同的 URI(请参阅 Carl 的回答)。我不知道您是否可以编辑您的 REST 服务,但最好的方法是: https ://angular-resource-test.firebaseIO.com/systems/用于查询(期望数组) https://angular -resource-test.firebaseIO.com/systems/:id获取。(期待一个对象)

使用此服务,您可以使用您的资源:

var System = $resource(
  'https://angular-resource-test.firebaseIO.com/systems/:id',
  {id: "@id"},
  {update: {method: "PUT"}}
);

你会这样打电话:

var systems = System.query({});
var system = System.get({id:1});
于 2013-03-20T02:39:54.807 回答
0

您的问题应该通过使用 isArray: true 来解决您的查询和获取 System 和 SystemType 的方法。它与您的 json 在服务器端的格式化方式有关。有关扩展讨论,请参阅 angular 文档。http://jsfiddle.net/D5E6w/24/

{
   update: { method: "PUT" },
   query: { method: "GET", isArray: true },
   get: { method: "GET", isArray: true }
}

这是一个包含系统集合和单个记录的工作示例。请注意每个的 isArray 值。http://jsfiddle.net/D5E6w/51/

于 2013-03-19T18:11:04.407 回答
0

这是我替换整个 $resource URL 的解决方案。我需要它,因为我正在使用HAL Rest 响应,例如,在分页时,我想替换整个 URL 而不仅仅是其中的参数。

app.factory('$rest', ['$resource', 'HALParser', function($resource, HALParser) {
    return function($url) {
        $url = ($url == null) ? 'http://localhost:8000/:type' : $url;
        return $resource($url, {type: ''}, {
            update: { method:'PUT' },
            get : {
                method: 'GET',
                transformResponse: [function(data) {
                    return (new HALParser()).parse(angular.fromJson(data));
                }]
            }
        });
    }
}]);

接着,

app.controller('VendorsController', ['$scope', '$rest', 
        function($scope, $rest) {

        $scope.data = $rest().get({type: 'vendors'});

        $scope.create = function() {
            $rest().save({type: 'vendors'}, {name: $scope.item});
        };
        $scope.load = function($item) {
            console.log($item);
        };

        $scope.page = function($url) {
            $scope.data = $rest($url).get();
        };
    }]);

我只是将 $resource 从我的服务信息返回一个带有参数 URL 的函数。

于 2014-02-14T08:42:43.037 回答