Extjs Sencha UUID自定义排序

bweufnob  于 2022-09-26  发布在  其他
关注(0)|答案(2)|浏览(153)

我正在尝试实现网格列UUID的自定义排序。我希望排序反映数据库的排序,例如按降序显示数据,如下所示:

select * from mytable order by uuid desc;

|    id    |                uuid              | 
|----------+----------------------------------+
| 10094875 |                                  | 
| 10093749 |                                  | 
| 10094905 |                                  |       
| 10094887 |                                  |                  
| 11268062 | fffffffffffffffffffff            |                 
| 11268010 | fffffffffffffffffffff            | 
| 11267357 | ffffffffffff                     | 
| 11267356 | fffff-fffff-ffff-ffff-ffff       | 
| 11267998 | eeda671280c7397c11347cb758e36b38 | 
| 10250739 | eeda671280c7397c11347cb758e36b38 |

因此,按降序排列,它应该首先出现空格/空项,然后是不带破折号的UUID,最后是带破折线的UUID。
目前,这些是降序排序时的结果:

这与我想要的很接近,但正如你所看到的,空行显示在底部而不是顶部。这是我的代码:

Ext.define('Traccar.model.MyModel', {
    extend: 'Ext.data.Model',
    identifier: 'negative',

    fields: [{
        ...
    }, {
    name: 'uuid',
    type: 'string',
    sortType: function (actualValue, replaceValue, arg1, arg2) {
          if (arg1 != null & arg2 != null) {
              if (actualValue === arg1 || actualValue === arg2) {
                  return replaceValue;
              } else
                  return actualValue;
          } else if (arg1 != null) {
              if (actualValue === arg1)
                  return replaceValue;
              else
                  return actualValue;
          } else
              return actualValue;
      }
}, ..
    }],   
});

有人知道我该怎么修吗?

iyfjxgzm

iyfjxgzm1#

您可以在网格列uuid上使用自定义排序器功能,以获取所需内容。因为您希望空字符串以ASC和DESC顺序首先出现,所以需要定义特殊规则。分拣机功能接收两个模型(例如model1model2),如果model1应在model2之前,则返回-1;如果顺序相同,则返回0;如果e1d 5d1e应位于model2之后,则返回1。你还必须注意方向属性。
函数本身可以如下所示,可以简化,但显示所有情况:

function (model1, model2) {
    const uuid1 = model1.get('uuid'),
        uuid2 = model2.get('uuid'),
        direction = this.getDirection();

    if (uuid1 == uuid2) { // same ordering
        return 0;
    }
    // if uuid1 is empty
    if (Ext.isEmpty(uuid1)) {
        return direction == 'ASC' ? -1 : 1;
    }
    // if uuid2 is empty
    if (Ext.isEmpty(uuid2)) {
        return direction == 'ASC' ? 1 : -1;
    }

    return uuid1 > uuid2 ? 1 : -1;
}

这是一个完整的本地数据示例,您可以复制粘贴并在Sencha Fiddle中运行:

Ext.define('MyModel', {
    extend: 'Ext.data.Model',
    fields: [{
        name: 'id',
        type: 'int'
    }, {
        name: 'uuid',
        type: 'string',
    }]
});

Ext.define('MyStore', {
    extend: 'Ext.data.Store',
    model: 'MyModel',
    data: [{
        id: 1,
        uuid: ''
    }, {
        id: 2,
        uuid: ''
    }, {
        id: 3,
        uuid: ''
    }, {
        id: 4,
        uuid: ''
    }, {
        id: 5,
        uuid: 'abc'
    }, {
        id: 6,
        uuid: 'def'
    }, {
        id: 7,
        uuid: 'ghi'
    }, {
        id: 9,
        uuid: 'jkl'
    }, {
        id: 9,
        uuid: 'mno'
    }, {
        id: 10,
        uuid: 'pqr'
    }],
    proxy: {
        type: 'memory'
    }
});

Ext.application({
    name: 'Fiddle',
    launch: function () {
        const store = Ext.create('MyStore');
        const grid = Ext.create({
            xtype: 'grid',
            renderTo: Ext.getBody(),
            store: store,
            title: 'Grid',
            columns: [{
                text: 'id',
                flex: 1,
                dataIndex: 'id'
            }, {
                text: 'uuid',
                flex: 4,
                dataIndex: 'uuid',
                sorter: function (model1, model2) {
                    const uuid1 = model1.get('uuid'),
                        uuid2 = model2.get('uuid'),
                        direction = this.getDirection();

                    if (uuid1 == uuid2) {
                        return 0;
                    }

                    if (Ext.isEmpty(uuid1)) {
                        return direction == 'ASC' ? -1 : 1;
                    }

                    if (Ext.isEmpty(uuid2)) {
                        return direction == 'ASC' ? 1 : -1;
                    }

                    return uuid1 > uuid2 ? 1 : -1;
                }
            }]
        });
    }
});
daolsyd0

daolsyd02#

无需在模型中定义sortType,只需定义字段string的类型。在您的店铺中,只需添加一个分拣机,如:

Ext.define('Traccar.store.MyStore', {
    model: 'negative',
    proxy: {...},
    sorters: [
        {
            property: 'uuid',
            direction: 'ASC'
        }
    ]
}

网格应按预期显示结果。

相关问题