diff options
Diffstat (limited to 'src/ngResource/resource.js')
| -rw-r--r-- | src/ngResource/resource.js | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/src/ngResource/resource.js b/src/ngResource/resource.js index ca92e629..37cc3e4d 100644 --- a/src/ngResource/resource.js +++ b/src/ngResource/resource.js @@ -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; } |
