2012-11-09 8 views
8

は、私は私がCreditCardResource.query(呼び出すたびように、CreditCardResourceは一定のuserIdにasociated持つことができるようにしたい

angular.module('clientApp').factory('CreditCardResource', function($resource) { 
    return $resource('/user/:userId/card/:cardId', 
    {cardId:'@id'}, { 
    charge: {method:'POST', params:{charge:true}} 
    }); 
}); 

を持っていると仮定)yが取得そのユーザーに関連するカード。私は毎回CreditCardResource.query({userId:123})を呼びたくありません。また、リソースをサービスとして維持したいと考えています。

私はコントローラの中でCreditCardResource.defaultParams.userId = '123'のようにしたいと思います。

この問題を解決する最良の方法は何ですか?

+2

ほとんど知られていないので、時々面白いと感じます。ここでは他のメインストリーム言語でも簡単に解決できる問題があります:) – mkoryak

答えて

6

アンgularリソースは、この正確な状況のためにResource.bind()メソッドを提供しています(私はv1.0.3を利用しています)。あなたのケースでは

、あなたのコードは次のようになります。

var BoundCreditCard = CreditCard.bind({userId: '123'}); 

// Performs a GET on /user/123/card/456 
var card = BoundCreditCard.get({cardId: "456"}); 
+0

ドキュメントを見つけることができませんでした。リンクを提供してください。構文は私にとっても意味をなさない。 – DavidLin

+0

残念ながら、この方法を見つけるためにソースを読まなければなりませんでした。 –

+0

申し訳ありませんが、私はこのポストのcoffeescriptから移植し、パラメータの角括弧を追加するのを忘れました。 –

1

おそらく$ resource.query()のインスタンスをデコレートできますか?これは一般的で非角度の例ですが、うまくいけばポイントを作っています。あなたのケースの 'someObj'は$ resourceになり、コントローラは 'defaultValue'の値を設定できます。

var proxiedFn, someObj; 

    someObj = { 
    someFn: function(valueA, valueB) { 
     console.log("Called with " + valueA + " and " + valueB); 
    } 
    }; 

    someObj.someFn('foo', 'bar'); /* before the proxy */ 
    proxiedFn = someObj.someFn; 

    someObj.someFn = function(valueB) { 
    return proxiedFn(this.defaultValue, valueB); 
    }; 

    someObj.defaultValue = 'boz'; 
    someObj.someFn('bar'); /* after the proxy with default value */ 
7

バージョン1.1.2ダイナミックデフォルトパラメータが

https://github.com/angular/angular.js/commit/cc42c99bec6a03d6c41b8e1d29ba2b1f5c16b87d

基本的に

、代わりにサポートされていますので:

あなたが使用
params: { 
    apiKey: user.getApiKey() 
} 

を:

params: { 
    apiKey: function() { 
     return user.getApiKey(); 
    } 
} 
+0

なぜこれが投票されたのかを確認してください。このコミットは便利な機能を提供します。 – myabc

1
angular.module('clientApp') 
.factory('User', ['$resource', 'UserCard', 
    function ($resource, UserCard) { 
     var User = $resource(
      "user/:id", 
      {id: "@id" }, 
      { 
       'save': {method: 'PUT'}, 
       'add': {method: 'POST'} 
      } 
     ); 
     User.prototype.getCards = function (params, callback) { 
      UserCard.prototype.userId = this.id; 
      params.userId = this.id; 
      return UserCard.query(params, callback); 
     }; 
     return User; 
    }]) 
.factory('UserCard', ['$resource', 
    function ($resource) { 
     return $resource(
      "user/:userId/card/:id", 
      {userId: '@userId', id: "@id" }, 
      { 
       'save': {method: 'PUT'}, 
       'add': {method: 'POST'} 
      } 
     ); 
    }]) 
.controller('TestCtrl', ['User', 
    function (User) { 
     // GET user/123 
     var user = User.get({id: 123}, function() { 
      // GET user/123/card/321 
      var card = user.getCard({id: 321}, function() { 
       card.someAttribute = 'Some value'; 
       // PUT user/123/card/321 
       card.$save(); 
      }); 
     }); 
    }]) 
; 

私のコードをチェックしてください。このようにして、私はすでにカードに関連付けられているカードを取得するので、card $ save()またはcard $ query()はuserIdやパラメータ、カードのプロパティを渡す必要はありません。

関連する問題