From 2d56e8d024513d86191499250a3cc68a474c94ec Mon Sep 17 00:00:00 2001 From: Guillaume Lecomte Date: Sat, 26 Jan 2013 20:03:41 +0100 Subject: [PATCH 1/2] feat($resource): allow override url in actions Add the ability to override the URL used in $resource custom actions. --- src/ngResource/resource.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/ngResource/resource.js b/src/ngResource/resource.js index 037a12ae6132..1f1e2a77e27d 100644 --- a/src/ngResource/resource.js +++ b/src/ngResource/resource.js @@ -123,7 +123,8 @@ // Define CreditCard class var CreditCard = $resource('/user/:userId/card/:cardId', {userId:123, cardId:'@id'}, { - charge: {method:'POST', params:{charge:true}} + charge: {method:'POST', params:{charge:true}}, + block: {method:'POST', url:'/user/:userId/card/:cardId/block'} }); // We can retrieve a collection from the server @@ -143,6 +144,10 @@ // our custom method is mapped as well. card.$charge({amount:9.99}); // POST: /user/123/card/456?amount=9.99&charge=true {id:456, number:'1234', name:'J. Smith'} + + // you can also override url in custom methods. + card.$block(); + // POST: /user/123/card/456/block }); // we can create an instance as well @@ -303,13 +308,13 @@ angular.module('ngResource', ['ng']). } Route.prototype = { - url: function(params) { + url: function(params, url) { var self = this, - url = this.template, val, encodedVal; params = params || {}; + url = url || this.template; forEach(this.urlParams, function(_, urlParam){ val = params.hasOwnProperty(urlParam) ? params[urlParam] : self.defaults[urlParam]; if (angular.isDefined(val) && val !== null) { @@ -413,7 +418,7 @@ angular.module('ngResource', ['ng']). } }); httpConfig.data = data; - httpConfig.url = route.url(extend({}, extractParams(data, action.params || {}), params)) + httpConfig.url = route.url(extend({}, extractParams(data, action.params || {}), params), action.url) function markResolved() { value.$resolved = true; }; From 4e342babdc915136f8ea5d0f87b83ef3962f2c57 Mon Sep 17 00:00:00 2001 From: Guillaume Lecomte Date: Sat, 26 Jan 2013 20:06:55 +0100 Subject: [PATCH 2/2] test($resource): test for url overriding Add test for URL overriding in $resource actions. --- test/ngResource/resourceSpec.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/ngResource/resourceSpec.js b/test/ngResource/resourceSpec.js index ad9280f51c70..9460c2481df7 100644 --- a/test/ngResource/resourceSpec.js +++ b/test/ngResource/resourceSpec.js @@ -521,4 +521,17 @@ describe("resource", function() { $httpBackend.flush(); expect(person.id).toEqual(456); }); + + it('should support override url template (action specific)', function() { + var Person = $resource('/Person/:id', {}, { + best: {method: 'GET', url: '/Person/best'} + }); + + $httpBackend.expect('GET', '/Person/best').respond({id: 'guillaume', email: 'g@g.com'}); + + var bestPerson = Person.best(); + $httpBackend.flush(); + + expect(bestPerson).toEqualData({id: 'guillaume', email: 'g@g.com'}); + }); });