UNPKG

4.29 kBJavaScriptView Raw
1(function ($) {
2 /***
3 * A sample AJAX data store implementation.
4 * Right now, it's hooked up to load search results from Octopart, but can
5 * easily be extended to support any JSONP-compatible backend that accepts paging parameters.
6 */
7 function RemoteModel() {
8 // private
9 var PAGESIZE = 50;
10 var data = {length: 0};
11 var searchstr = "";
12 var sortcol = null;
13 var sortdir = 1;
14 var h_request = null;
15 var req = null; // ajax request
16
17 // events
18 var onDataLoading = new Slick.Event();
19 var onDataLoaded = new Slick.Event();
20
21
22 function init() {
23 }
24
25
26 function isDataLoaded(from, to) {
27 for (var i = from; i <= to; i++) {
28 if (data[i] == undefined || data[i] == null) {
29 return false;
30 }
31 }
32
33 return true;
34 }
35
36
37 function clear() {
38 for (var key in data) {
39 delete data[key];
40 }
41 data.length = 0;
42 }
43
44
45 function ensureData(from, to) {
46 if (req) {
47 req.abort();
48 for (var i = req.fromPage; i <= req.toPage; i++)
49 data[i * PAGESIZE] = undefined;
50 }
51
52 if (from < 0) {
53 from = 0;
54 }
55
56 if (data.length > 0) {
57 to = Math.min(to, data.length - 1);
58 }
59
60 var fromPage = Math.floor(from / PAGESIZE);
61 var toPage = Math.floor(to / PAGESIZE);
62
63 while (data[fromPage * PAGESIZE] !== undefined && fromPage < toPage)
64 fromPage++;
65
66 while (data[toPage * PAGESIZE] !== undefined && fromPage < toPage)
67 toPage--;
68
69 if (fromPage > toPage || ((fromPage == toPage) && data[fromPage * PAGESIZE] !== undefined)) {
70 // TODO: look-ahead
71 onDataLoaded.notify({from: from, to: to});
72 return;
73 }
74
75 var url = "http://octopart.com/api/v3/parts/search?apikey=68b25f31&include[]=short_description&show[]=uid&show[]=manufacturer&show[]=mpn&show[]=brand&show[]=octopart_url&show[]=short_description&q=" + searchstr + "&start=" + (fromPage * PAGESIZE) + "&limit=" + (((toPage - fromPage) * PAGESIZE) + PAGESIZE);
76
77 if (sortcol != null) {
78 url += ("&sortby=" + sortcol + ((sortdir > 0) ? "+asc" : "+desc"));
79 }
80
81 if (h_request != null) {
82 clearTimeout(h_request);
83 }
84
85 h_request = setTimeout(function () {
86 for (var i = fromPage; i <= toPage; i++)
87 data[i * PAGESIZE] = null; // null indicates a 'requested but not available yet'
88
89 onDataLoading.notify({from: from, to: to});
90
91 req = $.jsonp({
92 url: url,
93 callbackParameter: "callback",
94 cache: true,
95 success: onSuccess,
96 error: function () {
97 onError(fromPage, toPage);
98 }
99 });
100 req.fromPage = fromPage;
101 req.toPage = toPage;
102 }, 50);
103 }
104
105
106 function onError(fromPage, toPage) {
107 alert("error loading pages " + fromPage + " to " + toPage);
108 }
109
110 function onSuccess(resp) {
111 var from = resp.request.start, to = from + resp.results.length;
112 data.length = Math.min(parseInt(resp.hits),1000); // limitation of the API
113
114 for (var i = 0; i < resp.results.length; i++) {
115 var item = resp.results[i].item;
116
117 data[from + i] = item;
118 data[from + i].index = from + i;
119 }
120
121 req = null;
122
123 onDataLoaded.notify({from: from, to: to});
124 }
125
126
127 function reloadData(from, to) {
128 for (var i = from; i <= to; i++)
129 delete data[i];
130
131 ensureData(from, to);
132 }
133
134
135 function setSort(column, dir) {
136 sortcol = column;
137 sortdir = dir;
138 clear();
139 }
140
141 function setSearch(str) {
142 searchstr = str;
143 clear();
144 }
145
146
147 init();
148
149 return {
150 // properties
151 "data": data,
152
153 // methods
154 "clear": clear,
155 "isDataLoaded": isDataLoaded,
156 "ensureData": ensureData,
157 "reloadData": reloadData,
158 "setSort": setSort,
159 "setSearch": setSearch,
160
161 // events
162 "onDataLoading": onDataLoading,
163 "onDataLoaded": onDataLoaded
164 };
165 }
166
167 // Slick.Data.RemoteModel
168 $.extend(true, window, { Slick: { Data: { RemoteModel: RemoteModel }}});
169})(jQuery);
\No newline at end of file