5

这里是一个简单的问题,我真的很惊讶我在任何地方都找不到答案。

我有以下产品型号:

Ext.define('Product', {
    extend: 'Ext.data.Model',
    fields: [
        {name: 'id', type: 'int'},
        {name: 'name', type: 'string'},
        {name: 'manufacturer', type: 'auto'}, // i.e. nested object literal
    ],
});

可以看出,产品内部有一个嵌套对象,其中包含有关制造商的详细信息(id、名称、描述等)。

我在 Ext.grid.Panel 中显示产品,如下所示:

Ext.create('Ext.grid.Panel', {
    title: 'Products',
    ...
    remoteSort: true,
    columns: [
        {text: 'Id', dataIndex: 'id', sortable: true},
        {text: 'Name',  dataIndex: 'name', sortable: true},
        {text: 'Manufacturer', dataIndex: 'manufacturer', sortable: true, renderer: function(manufacturer) {
                return manufacturer.name; // render manufacturer name
            }
        },
    ],
});

如您所见,所有三列都配置为可排序的,我正在使用远程排序。这适用于前两列,但第三列(制造商)给我带来了麻烦。

例如,当用户按产品名称对网格进行排序时,Ext 将以下 JSON 发送到服务器:

{ sort: [{ property: 'name', direction: 'ASC' }] }

这很好,因为服务器知道按每个产品的name属性简单地排序。

但是当用户按制造商对网格进行排序时,发送的 JSON 是:

{ sort: [{ property: 'manufacturer', direction: 'ASC' }] }

由于制造商是一个对象,这不会让服务器知道它应该根据制造商的哪个属性进行排序!是制造商的id吗?还是制造商的名字?或者是其他东西?

对于我的网格,由于我渲染了制造商的名称,我想按名称对其进行排序。但我看不出有办法告诉服务器这一点。而且我当然不想让我的服务器一直按制造商的名称排序。

如果 JSON 是这样发送的,那将是理想的:

{ sort: [{ property: 'manufacturer.name', direction: 'ASC' }] }

可悲的是,Ext 似乎没有这样做(?)。那么,解决方案是什么?

4

1 回答 1

8

好的,我在煎茶论坛上问过,得到了回复。看来您可以getSortParam()在列配置中覆盖。例子:

columns: [
    ...
    {
        header: 'Manufacturer',
        dataIndex: 'manufacturer',
        sortable: true,
        renderer: function(manufacturer) {
            return manufacturer.name; // render manufacturer name
        },
        getSortParam: function() {
            return 'manufacturer.name';
        },
    }
    ...
]

这将发送我在我的 OP 中描述的理想 JSON。现在我只需要让我的服务器正确解析它!:)

于 2013-02-11T06:14:14.630 回答