2012-11-09 21 views
8

varsayalım ben

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

ben her seferinde) CreditCardResource.query (dediğimiz y olsun, böylece bir CreditCardResource belli Userid için asociated sahip olmak isteyen var o kullanıcıyla ilgili kartlar. Her zaman CreditCardResource.query ({userId: 123}) aramak istemiyorum. Ve Kaynak'ın bir hizmet olarak kalmasını istiyorum.

Denetleyicimde CreditCardResource.defaultParams.userId = '123' gibi bir şey yapmak isterim.

Bu soruna yaklaşımda bulunmanın en iyi yolu nedir?

+2

açısal hakkında çok az şey biliniyor bazen eğlenceli buluyorum. Burada hemen hemen tüm diğer ana akım dillerinde çözmek çok kolay olacak sorunlar yaşıyoruz :) – mkoryak

cevap

6

Bir gular Resource, bu tam koşul için bir Resource.bind() yöntemi sağlar (v1.0.3 üzerindeyim). Senin durumunda

, kodunuz olmalıdır:

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

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

Belgeleri bulamadınız mı, lütfen bir bağlantı sağlayabilir misiniz? Sözdizimi, bana mantıklı bile değil. – DavidLin

+0

Maalesef bu yöntemi bulmak için kaynağı okumam gerekiyordu. –

+0

Üzgünüz, bu yazı için coffeescript'ten yükledim ve parantezleri parametrelere eklemeyi unuttum. –

1

Belki de $ resource.query() örneğinizi süsleyebilirsiniz? Bu genel, eğik olmayan bir örnektir, ancak umarım bu noktayı yapar. Durumunuzda 'someObj' $ kaynak olacaktır ve denetleyiciniz 'defaultValue' değerini ayarlayabilir. Sen kullanmak

params: { 
    apiKey: user.getApiKey() 
} 

: sürüm 1.1.2 dinamik varsayılan parametreleri yana

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(); 
      }); 
     }); 
    }]) 
; 

benim kodunu kontrol edin. Bu şekilde, zaten kullanıcıyla ilişkilendirilmiş kartlar alıyorum, bu nedenle card. $ Save() veya card. $ Query() 'ın userId kodunu veya parametrelerini veya kartın özelliklerini geçmesi gerekmez.

İlgili konular