From cc42c99bec6a03d6c41b8e1d29ba2b1f5c16b87d Mon Sep 17 00:00:00 2001 From: Pascal Corpet Date: Wed, 4 Jul 2012 10:07:09 +0200 Subject: [PATCH] feat($resource): allow dynamic default parameters Default resource params can now be calculated at runtime if defined via a function. --- src/ngResource/resource.js | 10 +++++++--- test/ngResource/resourceSpec.js | 29 +++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/ngResource/resource.js b/src/ngResource/resource.js index db86eb410ac7..28de3f7d7638 100644 --- a/src/ngResource/resource.js +++ b/src/ngResource/resource.js @@ -22,7 +22,8 @@ * `/user/:username`. * * @param {Object=} paramDefaults Default values for `url` parameters. These can be overridden in - * `actions` methods. + * `actions` methods. If any of the parameter value is a function, it will be executed every time + * when a param value needs to be obtained for a request (unless the param was overriden). * * Each key value in the parameter object is first bound to url template if present and then any * excess keys are appended to the url search query after the `?`. @@ -46,10 +47,12 @@ * resource object. * - `method` – {string} – HTTP request method. Valid methods are: `GET`, `POST`, `PUT`, `DELETE`, * and `JSONP` - * - `params` – {object=} – Optional set of pre-bound parameters for this action. + * - `params` – {Object=} – Optional set of pre-bound parameters for this action. If any of the + * parameter value is a function, it will be executed every time when a param value needs to be + * obtained for a request (unless the param was overriden). * - isArray – {boolean=} – If true then the returned object for this action is an array, see * `returns` section. - * - `headers` – {object=} – Optional HTTP headers to send + * - `headers` – {Object=} – Optional HTTP headers to send * * @returns {Object} A resource "class" object with methods for the default set of resource actions * optionally extended with custom `actions`. The default set contains these actions: @@ -316,6 +319,7 @@ angular.module('ngResource', ['ng']). var ids = {}; actionParams = extend({}, paramDefaults, actionParams); forEach(actionParams, function(value, key){ + if (isFunction(value)) { value = value(); } ids[key] = value.charAt && value.charAt(0) == '@' ? getter(data, value.substr(1)) : value; }); return ids; diff --git a/test/ngResource/resourceSpec.js b/test/ngResource/resourceSpec.js index 01466f1ceb72..3d2636888d7a 100644 --- a/test/ngResource/resourceSpec.js +++ b/test/ngResource/resourceSpec.js @@ -356,6 +356,35 @@ describe("resource", function() { }); + it('should support dynamic default parameters (global)', function() { + var currentGroup = 'students', + Person = $resource('/Person/:group/:id', { group: function() { return currentGroup; }}); + + + $httpBackend.expect('GET', '/Person/students/fedor').respond({id: 'fedor', email: 'f@f.com'}); + + var fedor = Person.get({id: 'fedor'}); + $httpBackend.flush(); + + expect(fedor).toEqualData({id: 'fedor', email: 'f@f.com'}); + }); + + + it('should support dynamic default parameters (action specific)', function() { + var currentGroup = 'students', + Person = $resource('/Person/:group/:id', {}, { + fetch: {method: 'GET', params: {group: function() { return currentGroup; }}} + }); + + $httpBackend.expect('GET', '/Person/students/fedor').respond({id: 'fedor', email: 'f@f.com'}); + + var fedor = Person.fetch({id: 'fedor'}); + $httpBackend.flush(); + + expect(fedor).toEqualData({id: 'fedor', email: 'f@f.com'}); + }); + + it('should exercise full stack', function() { var Person = $resource('/Person/:id');