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
            }
        },
    ],
});

ご覧のとおり、3つの列はすべて並べ替え可能に構成されており、リモート並べ替えを使用しています。これは最初の2列で機能しますが、3番目の列(メーカー)が問題を引き起こしています。

たとえば、ユーザーがグリッドを製品名で並べ替えると、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

わかりました、Sencha フォーラムで質問したところ、回答がありました。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 に答える