Skip to content

Commit 6a8749e

Browse files
committed
refactor($resource): unify and simplify the code
1 parent 1a5bebd commit 6a8749e

5 files changed

Lines changed: 484 additions & 491 deletions

File tree

angularFiles.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ angularFiles = {
55
'src/AngularPublic.js',
66
'src/JSON.js',
77
'src/Injector.js',
8-
'src/Resource.js',
98
'src/jqLite.js',
109
'src/apis.js',
1110
'src/service/anchorScroll.js',

src/Resource.js

Lines changed: 0 additions & 163 deletions
This file was deleted.

src/service/resource.js

Lines changed: 162 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,167 @@
202202
*/
203203
function $ResourceProvider() {
204204
this.$get = ['$http', function($http) {
205-
var resource = new ResourceFactory($http);
206-
return bind(resource, resource.route);
205+
var DEFAULT_ACTIONS = {
206+
'get': {method:'GET'},
207+
'save': {method:'POST'},
208+
'query': {method:'GET', isArray:true},
209+
'remove': {method:'DELETE'},
210+
'delete': {method:'DELETE'}
211+
};
212+
213+
214+
function Route(template, defaults) {
215+
this.template = template = template + '#';
216+
this.defaults = defaults || {};
217+
var urlParams = this.urlParams = {};
218+
forEach(template.split(/\W/), function(param){
219+
if (param && template.match(new RegExp("[^\\\\]:" + param + "\\W"))) {
220+
urlParams[param] = true;
221+
}
222+
});
223+
this.template = template.replace(/\\:/g, ':');
224+
}
225+
226+
Route.prototype = {
227+
url: function(params) {
228+
var self = this,
229+
url = this.template,
230+
encodedVal;
231+
232+
params = params || {};
233+
forEach(this.urlParams, function(_, urlParam){
234+
encodedVal = encodeUriSegment(params[urlParam] || self.defaults[urlParam] || "");
235+
url = url.replace(new RegExp(":" + urlParam + "(\\W)"), encodedVal + "$1");
236+
});
237+
url = url.replace(/\/?#$/, '');
238+
var query = [];
239+
forEachSorted(params, function(value, key){
240+
if (!self.urlParams[key]) {
241+
query.push(encodeUriQuery(key) + '=' + encodeUriQuery(value));
242+
}
243+
});
244+
url = url.replace(/\/*$/, '');
245+
return url + (query.length ? '?' + query.join('&') : '');
246+
}
247+
};
248+
249+
250+
function ResourceFactory(url, paramDefaults, actions) {
251+
var route = new Route(url);
252+
253+
actions = extend({}, DEFAULT_ACTIONS, actions);
254+
255+
function extractParams(data){
256+
var ids = {};
257+
forEach(paramDefaults || {}, function(value, key){
258+
ids[key] = value.charAt && value.charAt(0) == '@' ? getter(data, value.substr(1)) : value;
259+
});
260+
return ids;
261+
}
262+
263+
function Resource(value){
264+
copy(value || {}, this);
265+
}
266+
267+
forEach(actions, function(action, name) {
268+
var isPostOrPut = action.method == 'POST' || action.method == 'PUT';
269+
Resource[name] = function(a1, a2, a3, a4) {
270+
var params = {};
271+
var data;
272+
var success = noop;
273+
var error = null;
274+
switch(arguments.length) {
275+
case 4:
276+
error = a4;
277+
success = a3;
278+
//fallthrough
279+
case 3:
280+
case 2:
281+
if (isFunction(a2)) {
282+
if (isFunction(a1)) {
283+
success = a1;
284+
error = a2;
285+
break;
286+
}
287+
288+
success = a2;
289+
error = a3;
290+
//fallthrough
291+
} else {
292+
params = a1;
293+
data = a2;
294+
success = a3;
295+
break;
296+
}
297+
case 1:
298+
if (isFunction(a1)) success = a1;
299+
else if (isPostOrPut) data = a1;
300+
else params = a1;
301+
break;
302+
case 0: break;
303+
default:
304+
throw "Expected between 0-4 arguments [params, data, success, error], got " +
305+
arguments.length + " arguments.";
306+
}
307+
308+
var value = this instanceof Resource ? this : (action.isArray ? [] : new Resource(data));
309+
$http({
310+
method: action.method,
311+
url: route.url(extend({}, extractParams(data), action.params || {}, params)),
312+
data: data
313+
}).then(function(response) {
314+
var data = response.data;
315+
316+
if (data) {
317+
if (action.isArray) {
318+
value.length = 0;
319+
forEach(data, function(item) {
320+
value.push(new Resource(item));
321+
});
322+
} else {
323+
copy(data, value);
324+
}
325+
}
326+
(success||noop)(value, response.headers);
327+
}, error);
328+
329+
return value;
330+
};
331+
332+
333+
Resource.bind = function(additionalParamDefaults){
334+
return ResourceFactory(url, extend({}, paramDefaults, additionalParamDefaults), actions);
335+
};
336+
337+
338+
Resource.prototype['$' + name] = function(a1, a2, a3) {
339+
var params = extractParams(this),
340+
success = noop,
341+
error;
342+
343+
switch(arguments.length) {
344+
case 3: params = a1; success = a2; error = a3; break;
345+
case 2:
346+
case 1:
347+
if (isFunction(a1)) {
348+
success = a1;
349+
error = a2;
350+
} else {
351+
params = a1;
352+
success = a2 || noop;
353+
}
354+
case 0: break;
355+
default:
356+
throw "Expected between 1-3 arguments [params, success, error], got " +
357+
arguments.length + " arguments.";
358+
}
359+
var data = isPostOrPut ? this : undefined;
360+
Resource[name].call(this, params, data, success, error);
361+
};
362+
});
363+
return Resource;
364+
}
365+
366+
return ResourceFactory;
207367
}];
208368
}

0 commit comments

Comments
 (0)