-
Notifications
You must be signed in to change notification settings - Fork 0
/
backbone-tnetstrings.js
98 lines (78 loc) · 3.42 KB
/
backbone-tnetstrings.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
(function(){
// Map from CRUD to HTTP for our `Backbone.TNetStrings.sync`
// implementation.
var methodMap = {
'create': 'POST',
'update': 'PUT',
'delete': 'DELETE',
'read' : 'GET'
};
// Turn on `emulateTNetStrings` to support legacy servers that
// can't deal with direct `application/tnetstrings` requests
// ... will encode the body as `application/x-www-form-urlencoded`
// instead and will send the model in a form param named `model`.
Backbone.emulateTNetStrings = false;
// Backbone.TNetStrings
// --------------------
Backbone.TNetStrings = {
// Backbone-TNetStrings.sync
// -------------
// This method is very similar to the original Backbone.sync
// but use the TNetStrings serialisation format instead of
// JSON. If you are not familiar with TNetStrings,
// http://tnetstrings.org/ is a good starting point.
//
// It supports the Backbone.emulateHTTP and
// Backbone.emulateTNetStrings options.
sync: function(method, model, options, error) {
options || (options = {});
var type = methodMap[method];
// Default TNetStrings-request options.
var params = {type : type, dataType : 'tnetstrings'};
// Ensure that we have a URL.
if (!options.url) {
params.url = getUrl(model) || urlError();
}
// Ensure that we have the appropriate request data.
if (!options.data && model && (method == 'create' || method == 'update')) {
params.contentType = 'application/tnetstrings';
params.data = tnetstrings.dump(model.toJSON());
}
// For older servers, emulate JSON by encoding the request into an HTML-form.
if (Backbone.emulateTNetStrings) {
params.contentType = 'application/x-www-form-urlencoded';
params.data = params.data ? {model : params.data} : {};
}
// For older servers, emulate HTTP by mimicking the HTTP method with `_method`
// And an `X-HTTP-Method-Override` header.
if (Backbone.emulateHTTP) {
if (type === 'PUT' || type === 'DELETE') {
if (Backbone.emulateTNetStrings) params.data._method = type;
params.type = 'POST';
params.beforeSend = function(xhr) {
xhr.setRequestHeader('X-HTTP-Method-Override', type);
};
}
}
var success = options.success
options.success = function(resp, status, xhr) {
var resp = tnetstrings.parse(resp).value;
if (success) success(resp, status, xhr);
}
// Make the request, allowing the user to override any Ajax options.
return $.ajax(_.extend(params, options));
}
};
// Helpers
// -------
// Helper function to get a URL from a Model or Collection as a property
// or as a function.
var getUrl = function(object) {
if (!(object && object.url)) return null;
return _.isFunction(object.url) ? object.url() : object.url;
};
// Throw an error when a URL is needed, and none is supplied.
var urlError = function() {
throw new Error('A "url" property or function must be specified');
};
}).call(this);