9

我有这个端点

/clients/:id
/bills/:id
/clients/:id/bills

我正在尝试使用 angular-resource 创建一些资源来代表我的 API。

客户和账单资源

我为客户创建了一个资源,

.factory('Clients', function($resource){
   return $resource('/clients/:id')
})
.factory('Bills', function($resource){
   return $resource('/bills/:id')
});

那些工作得很好。

问题

我的问题是当我想定义一个资源来表示调用端点的客户端的账单时/client/:id/bills

我认为这应该是一个带有方法或类似方法的BillsgetFromClient()资源,因为它会从客户端返回一个 Bills 数组。但我已经使用了 Bills 的名称。并且端点与已经定义的端点不同。

知道如何构造这个吗?

4

2 回答 2

18

我想我一直在寻找的是现在在 Anguar 1.1

.factory('Bills', function($resource){
  return $resource('/bills/:id',{}, {
    get: {
      method: 'GET',
      params:{
        clientId: '@clientId'
      }
    },
    'getFromClient': {
      method:'GET',
      params: {
        clientId: '@clientId'
      },
      url: host + "/clients/:clientId/bills",
      isArray: true
     }
   })
});

现在您可以在方法声明中添加一个 url 属性来覆盖主 url。

如果您想使用一个能够解决这个问题和许多其他问题的库,您可以尝试https://github.com/platanus/angular-restmod

这是一个例子:

.factory('Client', function(restmod){
    return restmod.model('clients', {
        bills: { hasMany: 'Bill' }
    });
}

.factory('Bill', function(restmod){
    return restmod.model('bills');
}

.controller('myController', function(Client){
    $scope.client = Client.$find(1);
    $scope.client.bills.$search();
});
于 2013-06-07T12:31:41.273 回答
5

检查 ngResource 文档...向下滚动到第一个示例标题: http ://docs.angularjs.org/api/ngResource.$resource

这有点令人困惑,因为他们在示例中做得不对……哈哈

我相信它看起来像:

.factory('Clients', function($resource){
   return $resource('/clients/:id', {id:'@id'})
})
.factory('ClientBills', function($resource){
   return $resource('/clients/:clientId/bills/:id', {clientId:'@clientId', id:'@id'})
});

我没有测试过这个,但我认为这是正确的。=)

更新

然后您可以像这样访问它们:

.controller('MyCtrl', function ($scope, $routeParams, Clients, Bills) {
    $scope.client = Clients.get({id:$routeParams.clientId})
    $scope.bills = ClientBills.get({clientId:$routeParams.clientId})
})

我还将服务的名称更改为“ClientBills”,因为它更特定于任务,您可能想要一个不需要客户端 ID 的“Bills”服务......

于 2013-04-02T05:50:18.987 回答