diff options
| author | Pascal Corpet | 2012-07-04 10:07:09 +0200 | 
|---|---|---|
| committer | Igor Minar | 2012-11-28 16:01:57 +0100 | 
| commit | cc42c99bec6a03d6c41b8e1d29ba2b1f5c16b87d (patch) | |
| tree | ef3ebb8c2c792da08ab642492d1f347f6459aba1 | |
| parent | 3c7bfa77aad5e3f8c71bc63a7cd91c2586d8560a (diff) | |
| download | angular.js-cc42c99bec6a03d6c41b8e1d29ba2b1f5c16b87d.tar.bz2 | |
feat($resource): allow dynamic default parameters
Default resource params can now be calculated at runtime if defined
via a function.
| -rw-r--r-- | src/ngResource/resource.js | 10 | ||||
| -rw-r--r-- | 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 db86eb41..28de3f7d 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 01466f1c..3d263688 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');  | 
