2012-11-09 13 views
8

Załóżmy, że mam

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

Chcę móc mieć CreditCardResource asociated do pewnego identyfikatora użytkownika, tak, że za każdym razem zadzwonię CreditCardResource.query() y dostać karty związane z tym użytkownikiem. Nie chcę za każdym razem wywoływać CreditCardResource.query ({userId: 123}). Chcę, aby zasób pozostał jako usługa.

Chciałbym zrobić coś w stylu: CreditCardResource.defaultParams.userId = '123' w moim kontrolerze.

Jaki jest najlepszy sposób na rozwiązanie tego problemu?

+2

Tak niewiele wiadomo na temat kątowych, że czasami jest to zabawne. tutaj mamy problemy, które byłyby TAK łatwe do rozwiązania w prawie każdym innym głównym języku strumienia :) – mkoryak

Odpowiedz

6

gular Resource zapewnia metodę Resource.bind() dla tej dokładnej okoliczności (jestem na v1.0.3).

W twoim przypadku, kod powinien być:

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

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

Nie można znaleźć dokumentacji, czy mógłbyś podać link? Składnia nie ma nawet dla mnie sensu. – DavidLin

+0

Musiałem przeczytać źródło, aby znaleźć tę metodę niestety. –

+0

Przepraszam, przeportowałem go z coffeescript dla tego posta i zapomniałem dodać nawiasy dla parametrów. –

1

Możesz udekorować instancję $ resource.query()? Jest to ogólny, niekątny przykład, ale mam nadzieję, że o to chodzi. "someObj" w twoim przypadku to $ resource, a twój kontroler może ustawić wartość dla "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(); 
      }); 
     }); 
    }]) 
; 

Sprawdź mój kod. W ten sposób otrzymuję karty już skojarzone z użytkownikiem, więc karta. $ Save() lub karta. $ Query() nie musi przekazywać identyfikatora użytkownika ani parametrów, ani właściwości karty.

Powiązane problemy