9

私はこのエンドポイントを持っています

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

APIを表すためにangular-resourceを使用していくつかのリソースを作成しようとしています。

クライアントと請求書のリソース

クライアント向けのリソースを作成しました。

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

それらはうまくいきました。

問題

私の問題は、エンドポイントを呼び出すクライアントの請求書を表すリソースを定義したいときです/client/:id/bills

これは、クライアントからBillの配列を返すため、メソッドなどを使用したBillsリソースである必要があると思いました。getFromClient()しかし、私はすでにビルの名前を使用しています。また、エンドポイントはすでに定義されているものとは異なります。

これをどのように構成するかについて何か考えはありますか?

4

2 に答える 2

18

私が探していたのは今Anguar1.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 に答える