【问题标题】:AngularJs ngResource for nested api resurces with different endpointsAngularJs ngResource 用于具有不同端点的嵌套 api 资源
【发布时间】:2013-03-25 20:05:27
【问题描述】:

我有这个端点

/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 的客户端的账单时

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

知道如何构建它吗?

【问题讨论】:

  • 为什么不将两个变量传递给客户端? idbills 之类的东西?如果你留下最后一个未定义,你只会从某个客户那里得到所有东西,如果它是真的,你只会得到它的账单。
  • @Flek 但是如果我将变量传递给客户端服务将返回Client 资源而不是Bill 资源(使用客户端方法)

标签: javascript rest angularjs angular-resource


【解决方案1】:

我想我现在在 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();
});

【讨论】:

  • 你能链接到解释这个的文档吗?
【解决方案2】:

检查 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”服务...

【讨论】:

  • 感谢 thom 和 @max,如果我需要使用 angular 1.0,我认为这是一个好方法
  • 我想你还是想调用 ClientBills.query(..),因为它会返回一个账单数组
猜你喜欢
  • 1970-01-01
  • 2013-10-24
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-21
相关资源
最近更新 更多