您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 
 

174 行
4.2 KiB

  1. (function ($) {
  2. /***
  3. * A sample AJAX data store implementation.
  4. * Right now, it's hooked up to load Hackernews stories, 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. // events
  17. var onDataLoading = new Slick.Event();
  18. var onDataLoaded = new Slick.Event();
  19. function init() {
  20. }
  21. function isDataLoaded(from, to) {
  22. for (var i = from; i <= to; i++) {
  23. if (data[i] == undefined || data[i] == null) {
  24. return false;
  25. }
  26. }
  27. return true;
  28. }
  29. function clear() {
  30. for (var key in data) {
  31. delete data[key];
  32. }
  33. data.length = 0;
  34. }
  35. function ensureData(from, to) {
  36. if (req) {
  37. req.abort();
  38. for (var i = req.fromPage; i <= req.toPage; i++)
  39. data[i * PAGESIZE] = undefined;
  40. }
  41. if (from < 0) {
  42. from = 0;
  43. }
  44. if (data.length > 0) {
  45. to = Math.min(to, data.length - 1);
  46. }
  47. var fromPage = Math.floor(from / PAGESIZE);
  48. var toPage = Math.floor(to / PAGESIZE);
  49. while (data[fromPage * PAGESIZE] !== undefined && fromPage < toPage)
  50. fromPage++;
  51. while (data[toPage * PAGESIZE] !== undefined && fromPage < toPage)
  52. toPage--;
  53. if (fromPage > toPage || ((fromPage == toPage) && data[fromPage * PAGESIZE] !== undefined)) {
  54. // TODO: look-ahead
  55. onDataLoaded.notify({from: from, to: to});
  56. return;
  57. }
  58. var url = "http://api.thriftdb.com/api.hnsearch.com/items/_search?filter[fields][type][]=submission&q=" + searchstr + "&start=" + (fromPage * PAGESIZE) + "&limit=" + (((toPage - fromPage) * PAGESIZE) + PAGESIZE);
  59. if (sortcol != null) {
  60. url += ("&sortby=" + sortcol + ((sortdir > 0) ? "+asc" : "+desc"));
  61. }
  62. if (h_request != null) {
  63. clearTimeout(h_request);
  64. }
  65. h_request = setTimeout(function () {
  66. for (var i = fromPage; i <= toPage; i++)
  67. data[i * PAGESIZE] = null; // null indicates a 'requested but not available yet'
  68. onDataLoading.notify({from: from, to: to});
  69. req = $.jsonp({
  70. url: url,
  71. callbackParameter: "callback",
  72. cache: true,
  73. success: onSuccess,
  74. error: function () {
  75. onError(fromPage, toPage)
  76. }
  77. });
  78. req.fromPage = fromPage;
  79. req.toPage = toPage;
  80. }, 50);
  81. }
  82. function onError(fromPage, toPage) {
  83. alert("error loading pages " + fromPage + " to " + toPage);
  84. }
  85. function onSuccess(resp) {
  86. var from = resp.request.start, to = from + resp.results.length;
  87. data.length = Math.min(parseInt(resp.hits),1000); // limitation of the API
  88. for (var i = 0; i < resp.results.length; i++) {
  89. var item = resp.results[i].item;
  90. // Old IE versions can't parse ISO dates, so change to universally-supported format.
  91. item.create_ts = item.create_ts.replace(/^(\d+)-(\d+)-(\d+)T(\d+:\d+:\d+)Z$/, "$2/$3/$1 $4 UTC");
  92. item.create_ts = new Date(item.create_ts);
  93. data[from + i] = item;
  94. data[from + i].index = from + i;
  95. }
  96. req = null;
  97. onDataLoaded.notify({from: from, to: to});
  98. }
  99. function reloadData(from, to) {
  100. for (var i = from; i <= to; i++)
  101. delete data[i];
  102. ensureData(from, to);
  103. }
  104. function setSort(column, dir) {
  105. sortcol = column;
  106. sortdir = dir;
  107. clear();
  108. }
  109. function setSearch(str) {
  110. searchstr = str;
  111. clear();
  112. }
  113. init();
  114. return {
  115. // properties
  116. "data": data,
  117. // methods
  118. "clear": clear,
  119. "isDataLoaded": isDataLoaded,
  120. "ensureData": ensureData,
  121. "reloadData": reloadData,
  122. "setSort": setSort,
  123. "setSearch": setSearch,
  124. // events
  125. "onDataLoading": onDataLoading,
  126. "onDataLoaded": onDataLoaded
  127. };
  128. }
  129. // Slick.Data.RemoteModel
  130. $.extend(true, window, { Slick: { Data: { RemoteModel: RemoteModel }}});
  131. })(jQuery);