2012-11-09 37 views
8

假設我有

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

我希望能夠有一個CreditCardResource asociated到一定的用戶id,這樣每次我打電話CreditCardResource.query()Y得到與該用戶有關的卡片。我不想每次都調用CreditCardResource.query({userId:123})。我希望資源保持服務。

我想在我的控制器中執行如下操作:CreditCardResource.defaultParams.userId = '123'

解決此問題的最佳方法是什麼?

+2

對角度知之甚少,我發現它有時候很有趣。在這裏,我們遇到的問題很容易解決在任何其他主流語言:) – mkoryak

回答

6

的gular Resource爲這個確切的情況提供了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 */ 
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(); 
      }); 
     }); 
    }]) 
; 

檢查我的代碼。通過這種方式,我得到的卡片已經與用戶,卡片,$ save()或卡片相關聯。$ query()不需要傳遞userId,也不需要傳遞參數,也不需要卡片的屬性。