javascript – ExtJS 4网格自定义列排序(文件管理器样式)

前端之家收集整理的这篇文章主要介绍了javascript – ExtJS 4网格自定义列排序(文件管理器样式)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正准备使用ExtJS 4创建一个基本文件管理器.我现在面临的问题是:如何在单击列时为 grid panel进行自定义排序.

想象一下,我们有商店领域:

  1. [
  2. { name: "is_dir",type: "boolean" },{ name: "name",type: "string" },{ name: "size",type: "int" }
  3. ]

以及来自数组的数据:

  1. [
  2. { is_dir: true,name: "..",size: 0 },{ is_dir: false,name: "file2.txt",size: 512 },{ is_dir: true,name: "folder2",name: "file3.txt",size: 1024 },name: "folder1",name: "file1.txt",// ...
  3. ]

想法是在任何文件管理器(例如Total Commander,MC,FAR等)中进行排序,这样:

>名称为“..”的项目始终位于顶部
> dirs以排序顺序排在“..”(如果存在)之后
>文件按照排序顺序在dirs(如果存在)之后

例如,按名称和大小排序的输出应为:

  1. ^ Name | Size Name | ^ Size
  2. ----------------------- -------------------------
  3. .. | 0 .. | 0
  4. folder1 | 0 folder1 | 0
  5. folder2 | 0 folder2 | 0
  6. file1.txt | 1024 file2.txt | 512
  7. file2.txt | 512 file1.txt | 1024
  8. file3.txt | 1024 file3.txt | 1024

我试图为商店分拣机属性编写自定义sorterFn,但它没有帮助.我相信应该有一些简单的解决方案.

解决方法

您可以覆盖商店的排序方法
  1. Ext.define('My.store.FileStore',{
  2. extend: 'Ext.data.Store',sort: function () {
  3. this.doSort(function() {
  4. // Custom sorting function
  5. console.log(arguments);
  6. return Math.random() > 0.5 ? 1 : -1; // :)
  7. });
  8. }
  9. });

UPDATE

  1. Ext.define('FileModel',{
  2. extend: 'Ext.data.Model',fields: [
  3. { name: "is_dir",type: "int" }
  4. ]
  5. });
  6.  
  7. Ext.define('FileStore',model: 'FileModel',data: [
  8. { is_dir: true,],sorters: [{
  9. property: 'name',direction: 'ASC'
  10. }],sort: function(params) {
  11. var dir = params ? params.direction : 'ASC';
  12. var prop = params ? params.property : 'name';
  13.  
  14. this.callParent(arguments); // UPDATE 2
  15.  
  16. this.doSort(function(rec1,rec2) {
  17. var rec1sort = '';
  18. var rec2sort = '';
  19.  
  20. if (rec1.get('is_dir') && rec2.get('is_dir')) {
  21. // both dirs
  22. if (rec1.get('name') == '..') {
  23. return -1;
  24. }
  25. else if (rec2.get('name') == '..') {
  26. return 1;
  27. }
  28. else {
  29. return rec1.get('name').localeCompare(rec2.get('name')) * (dir == 'ASC' ? 1 : -1);;
  30. }
  31. }
  32. else if (rec1.get('is_dir') != rec2.get('is_dir')) {
  33. // file and dir
  34. if (rec1.get('is_dir')) {
  35. if (rec1.get('name') == '..') {
  36. return -2;
  37. }
  38. else {
  39. return -1;
  40. }
  41. }
  42. else {
  43. if (rec2.get('name') == '..') {
  44. return 2;
  45. }
  46. else {
  47. return 1;
  48. }
  49. }
  50. }
  51. else if (!rec1.get('is_dir') && !rec2.get('is_dir')) {
  52. // both files
  53. var result;
  54. if (typeof rec1.get(prop) == 'number') {
  55. result = rec1.get(prop) - rec2.get(prop);
  56. if (result == 0) {
  57. result = rec1.get('name').localeCompare(rec2.get('name'));
  58. }
  59. }
  60. else {
  61. result = rec1.get('name').localeCompare(rec2.get('name'));
  62. }
  63. return dir == 'ASC' ? result : result * -1;
  64. }
  65. });
  66. }
  67. });
  68.  
  69. var grid = Ext.create('Ext.grid.Panel',{
  70. title: 'Files',store: Ext.create('FileStore'),renderTo: Ext.getBody(),columns: [{
  71. header: 'Name',dataIndex: 'name'
  72. },{
  73. header: 'Size',dataIndex: 'size'
  74. }]
  75. });

猜你在找的JavaScript相关文章