jquery.vtable.js 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. /**
  2. * Vue-jQuery 表格插件
  3. * 暂时只支持单页面内个jQuery对象
  4. *
  5. * author
  6. * 2015-12-14
  7. */
  8. ;(function($) {
  9. $.fn.extend({
  10. /**
  11. * 初始化表格
  12. */
  13. 'vtable': function(args) {
  14. // 默认设置
  15. var defaults = {
  16. url: '', // 请求的地址
  17. // tableClass: [], // 表格的class列表
  18. sort: '', // 排序字段
  19. order: 'desc', // 排序方式,默认为DESC排序
  20. pagination: false, // 是否分页,默认否
  21. page: 1, // 页码
  22. rows: 20, // 每页条目数
  23. count: 0, // 数据总数
  24. pageCount: 0, // 总页数
  25. columns: [], // 展示字段设置
  26. query: [], // 查询条件设置
  27. beforeLoad: function() { // 数据加载钱的回调
  28. },
  29. onSelect: function(index, row) { // 选择Row时的回调函数
  30. console.log(row);
  31. console.log(index);
  32. },
  33. afterLoad: function(data) { // 数据加载完成后的回调函数
  34. console.log(data);
  35. }
  36. };
  37. if (typeof(vtable_options) == 'undefined') {
  38. vtable_options = $.extend(defaults, args);
  39. } else {
  40. vtable_options = $.extend(vtable_options, args);
  41. }
  42. // 私有方法
  43. vtable_privateFunction = {
  44. // 发送请求
  45. request: function() {
  46. // query及page条件
  47. dataOpt = {};
  48. $.extend(dataOpt, vtable_options.query);
  49. if (vtable_options.pagination) {
  50. var pageOpt = {
  51. page : vtable_options.page,
  52. rows : vtable_options.rows,
  53. sort : vtable_options.sort,
  54. order : vtable_options.order
  55. }
  56. $.extend(dataOpt, pageOpt);
  57. }
  58. $.post(
  59. vtable_options.url,
  60. dataOpt,
  61. function(res) {
  62. var data = $.parseJSON(res);
  63. v_table.data = data.list;
  64. vtable_options.count = data.count;
  65. vtable_options.pageCount = parseInt(data.count / vtable_options.rows) + 1;
  66. if (vtable_options.page == 1) {
  67. v_table.prev = 'am-disabled';
  68. } else {
  69. v_table.prev = '';
  70. }
  71. if (vtable_options.page == vtable_options.pageCount) {
  72. v_table.next = 'am-disabled';
  73. } else {
  74. v_table.next = '';
  75. }
  76. v_table.page = vtable_options.page;
  77. v_table.pageCount = vtable_options.pageCount;
  78. vtable_options.afterLoad(data);
  79. }
  80. );
  81. },
  82. // 选择事件
  83. selected: function(index) {
  84. var data = v_table.data;
  85. var row = data[index];
  86. vtable_options.onSelect(index, row);
  87. },
  88. // 上一页
  89. prev: function(key) {
  90. console.log('prev');
  91. if (vtable_options.page == 1) {
  92. alert('已经是第一页了');
  93. return true;
  94. } else {
  95. vtable_options.page--;
  96. this.request();
  97. }
  98. },
  99. // 下一页
  100. next: function(key) {
  101. console.log('next');
  102. if (vtable_options['page'] == vtable_options['pageCount']) {
  103. alert('已经是最后一页了');
  104. } else {
  105. vtable_options['page']++;
  106. this.request();
  107. }
  108. }
  109. }
  110. vtable_options.beforeLoad();
  111. // 生成表格
  112. if (typeof(v_table) == 'undefined') {
  113. // // 添加表格模板
  114. // var tableClass = vtable_options.tableClass;
  115. // var tableClassList = '';
  116. // for (key in tableClass) {
  117. // tableClassList += tableClass[key] + ' ';
  118. // }
  119. // 表格模板
  120. var tableTpl = '<table class="am-table am-table-radius am-table-striped am-table-hover" id="vtable_grid">';
  121. tableTpl += '<thead><tr><th v-for="column in columns">{{column.name}}</th></tr></thead>';
  122. tableTpl += '<tbody><tr v-for="entry in data" onclick="vtable_privateFunction.selected({{$index}});" index="{{$index}}"><td v-for="column in columns">{{entry[column[\'key\']]}}</td></tr></tbody>';
  123. tableTpl += '</tbody>';
  124. this.append(tableTpl);
  125. // 分页模板
  126. if (vtable_options.pagination == true) {
  127. pageTpl = '<ul class="am-pagination am-pagination-centered">';
  128. pageTpl += '<li class="am-pagination-prev {{prev}}"><a href="javascript:;" onclick="vtable_privateFunction.prev();" id="vtable_prev"><span class="am-icon-angle-double-left"> 上一页</a></li>';
  129. pageTpl += '<li class="am-disabled" style="width:100px;"><span>{{page}}/{{pageCount}}</span></li>'
  130. pageTpl += '<li class="am-pagination-next {{next}}"><a href="javascript:;" onclick="vtable_privateFunction.next();" id="vtable_next">下一页 <span class="am-icon-angle-double-right"></span></a></li>';
  131. pageTpl += '</ul>';
  132. this.append(pageTpl);
  133. }
  134. // 初始化v_table[this.vid]
  135. v_table = new Vue({
  136. el: this.selector,
  137. data: {
  138. columns: vtable_options.columns,
  139. data: [],
  140. prev: '',
  141. next: '',
  142. page: 0,
  143. pageCount: 0
  144. }
  145. });
  146. // 初次获取数据
  147. vtable_privateFunction.request();
  148. } else {
  149. // 筛选
  150. console.log(vtable_options.query);
  151. vtable_privateFunction.request();
  152. }
  153. return this;
  154. }
  155. });
  156. })(jQuery);