mirror of
https://github.com/Hopiu/angular.js.git
synced 2026-03-16 23:30:23 +00:00
feat($resource): ability to override url in resource actions
Resources now can defined per action url override. The url is treated as a template rather than a literal string, so fancy interpolations are possible. See attached tests for example usage.
This commit is contained in:
parent
cf17c6af47
commit
60f1f099fc
2 changed files with 79 additions and 13 deletions
|
|
@ -53,6 +53,8 @@
|
|||
* - **`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).
|
||||
* - **`url`** – {string} – action specific `url` override. The url templating is supported just like
|
||||
* for the resource-level urls.
|
||||
* - **`isArray`** – {boolean=} – If true then the returned object for this action is an array, see
|
||||
* `returns` section.
|
||||
* - **`transformRequest`** – `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –
|
||||
|
|
@ -306,30 +308,32 @@ angular.module('ngResource', ['ng']).
|
|||
function Route(template, defaults) {
|
||||
this.template = template = template + '#';
|
||||
this.defaults = defaults || {};
|
||||
var urlParams = this.urlParams = {};
|
||||
forEach(template.split(/\W/), function(param){
|
||||
if (param && (new RegExp("(^|[^\\\\]):" + param + "\\W").test(template))) {
|
||||
urlParams[param] = true;
|
||||
}
|
||||
});
|
||||
this.template = template.replace(/\\:/g, ':');
|
||||
this.urlParams = {};
|
||||
}
|
||||
|
||||
Route.prototype = {
|
||||
setUrlParams: function(config, params) {
|
||||
setUrlParams: function(config, params, actionUrl) {
|
||||
var self = this,
|
||||
url = this.template,
|
||||
url = actionUrl || self.template,
|
||||
val,
|
||||
encodedVal;
|
||||
|
||||
var urlParams = self.urlParams = {};
|
||||
forEach(url.split(/\W/), function(param){
|
||||
if (param && (new RegExp("(^|[^\\\\]):" + param + "(\\W|$)").test(url))) {
|
||||
urlParams[param] = true;
|
||||
}
|
||||
});
|
||||
url = url.replace(/\\:/g, ':');
|
||||
|
||||
params = params || {};
|
||||
forEach(this.urlParams, function(_, urlParam){
|
||||
forEach(self.urlParams, function(_, urlParam){
|
||||
val = params.hasOwnProperty(urlParam) ? params[urlParam] : self.defaults[urlParam];
|
||||
if (angular.isDefined(val) && val !== null) {
|
||||
encodedVal = encodeUriSegment(val);
|
||||
url = url.replace(new RegExp(":" + urlParam + "(\\W)", "g"), encodedVal + "$1");
|
||||
url = url.replace(new RegExp(":" + urlParam + "(\\W|$)", "g"), encodedVal + "$1");
|
||||
} else {
|
||||
url = url.replace(new RegExp("(\/?):" + urlParam + "(\\W)", "g"), function(match,
|
||||
url = url.replace(new RegExp("(\/?):" + urlParam + "(\\W|$)", "g"), function(match,
|
||||
leadingSlashes, tail) {
|
||||
if (tail.charAt(0) == '/') {
|
||||
return tail;
|
||||
|
|
@ -427,7 +431,7 @@ angular.module('ngResource', ['ng']).
|
|||
}
|
||||
});
|
||||
httpConfig.data = data;
|
||||
route.setUrlParams(httpConfig, extend({}, extractParams(data, action.params || {}), params));
|
||||
route.setUrlParams(httpConfig, extend({}, extractParams(data, action.params || {}), params), action.url);
|
||||
|
||||
function markResolved() { value.$resolved = true; }
|
||||
|
||||
|
|
|
|||
|
|
@ -703,4 +703,66 @@ describe("resource", function() {
|
|||
$httpBackend.flush();
|
||||
expect(person.id).toEqual(456);
|
||||
});
|
||||
|
||||
|
||||
describe('action-level url override', function() {
|
||||
|
||||
it('should support overriding url template with static url', function() {
|
||||
$httpBackend.expect('GET', '/override-url?type=Customer&typeId=123').respond({id: 'abc'});
|
||||
var TypeItem = $resource('/:type/:typeId', {type: 'Order'}, {
|
||||
get: {
|
||||
method: 'GET',
|
||||
params: {type: 'Customer'},
|
||||
url: '/override-url'
|
||||
}
|
||||
});
|
||||
var item = TypeItem.get({typeId: 123});
|
||||
$httpBackend.flush();
|
||||
expect(item).toEqualData({id: 'abc'});
|
||||
});
|
||||
|
||||
|
||||
it('should support overriding url template with a new template ending in param', function() {
|
||||
// url parameter in action, parameter ending the string
|
||||
$httpBackend.expect('GET', '/Customer/123').respond({id: 'abc'});
|
||||
var TypeItem = $resource('/foo/:type', {type: 'Order'}, {
|
||||
get: {
|
||||
method: 'GET',
|
||||
params: {type: 'Customer'},
|
||||
url: '/:type/:typeId'
|
||||
}
|
||||
});
|
||||
var item = TypeItem.get({typeId: 123});
|
||||
$httpBackend.flush();
|
||||
expect(item).toEqualData({id: 'abc'});
|
||||
|
||||
// url parameter in action, parameter not ending the string
|
||||
$httpBackend.expect('GET', '/Customer/123/pay').respond({id: 'abc'});
|
||||
var TypeItem = $resource('/foo/:type', {type: 'Order'}, {
|
||||
get: {
|
||||
method: 'GET',
|
||||
params: {type: 'Customer'},
|
||||
url: '/:type/:typeId/pay'
|
||||
}
|
||||
});
|
||||
var item = TypeItem.get({typeId: 123});
|
||||
$httpBackend.flush();
|
||||
expect(item).toEqualData({id: 'abc'});
|
||||
});
|
||||
|
||||
|
||||
it('should support overriding url template with a new template ending in string', function() {
|
||||
$httpBackend.expect('GET', '/Customer/123/pay').respond({id: 'abc'});
|
||||
var TypeItem = $resource('/foo/:type', {type: 'Order'}, {
|
||||
get: {
|
||||
method: 'GET',
|
||||
params: {type: 'Customer'},
|
||||
url: '/:type/:typeId/pay'
|
||||
}
|
||||
});
|
||||
var item = TypeItem.get({typeId: 123});
|
||||
$httpBackend.flush();
|
||||
expect(item).toEqualData({id: 'abc'});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
|||
Loading…
Reference in a new issue