嵌套api的AngularJs ngResource使用不同的端点重新生成

bla*_*jid 9 javascript rest angularjs angular-resource

我有这个终点

/clients/:id
/bills/:id
/clients/:id/bills
Run Code Online (Sandbox Code Playgroud)

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

客户和账单资源

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

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

工作得很好.

问题

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

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

知道如何构建这个吗?

bla*_*jid 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
     }
   })
});
Run Code Online (Sandbox Code Playgroud)

现在,您可以向方法声明添加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();
});
Run Code Online (Sandbox Code Playgroud)


Tho*_*ter 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'})
});
Run Code Online (Sandbox Code Playgroud)

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

UPDATE

然后你会像这样访问它们:

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

我还将服务名称更改为"ClientBills",因为它更具体到任务,您可能需要一个不需要客户端ID的"Bills"服务...