5

ExtJS4グリッドパネルのビューを動的に変更する必要があります。

デフォルトでは、グリッドはテーブルとして表示されますが、私のアプリケーションでは、グリッドをテーブルビューからタイル(またはカード)ビューに切り替える機能が必要です。以下に、それがどのように見えるべきかを表現しようとしました。

 Normal view:                               Tiles view:
 ======================================     ====================================
 | Name       | Description           |     | Name       | Description         |
 ======================================     ====================================
 | Name 1     | First description   |^|     |  ------     ------     ------  |^|
 |----------------------------------|X|     | | O  O |   | @  @ |   | >  < | |X|
 | Name 2     | Second description  |X|     | | \__/ |   | \__/ |   | \__/ | |X|
 |----------------------------------|X|     |  ------     ------     ------  |X|
 | Name 3     | Third description   | |     |  Name 1     Name 2     Name 3  | |
 |----------------------------------| |     |                                | |
 |            |                     | |     |  ------     ------     ------  | |
 | ...        | ...                 |v|     | | o  O |   | -  - |   | *  * | |v|
 ======================================     ====================================

Ext.ux.grid.ExplorerViewという名前の、必要なもののほぼ完璧な実装を見つけました。ただし、この拡張機能はExtJSバージョン2.x(3.x)用に開発されたものであり、ExtJS4で再利用することはできません。

私は次のように単純に作成されたグリッドを使用します。

Ext.create("Ext.grid.Panel", {
    store: ...,
    columns: [{
        header: "Name",
        dataIndex: "name",
    }, {
        header: "Description",
        dataIndex: "description"
    }],
    tbar: [ ... ],
    bbar: [ ... ],
    listeners: { ... },
    multiSelect: true,
    viewConfig: {
        stripeRows: true,
        markDirty: false,
        listeners: { ... }
    }
});

tpl内部ビューコンポーネントのプロパティを更新しようとしましたが、何も機能しないようです。

単一のグリッドパネルのビューを動的に切り替える方法について何か考えがありますか?

4

2 に答える 2

5

この問題は、 Harald Hanekによって開発された" Tileview "というグリッド パネルの素晴らしい機能によって簡単に解決されました。このソリューションはExtJS 4用に特別に開発されました。

基本的な使用例は次のとおりです。

var grid = Ext.create("Ext.grid.Panel", {
    store: ...,
    columns: [{
        header: "Name",
        dataIndex: "name",
    }, {
        header: "Description",
        dataIndex: "description"
    }],
    tbar: [ ... ],
    bbar: [ ... ],
    listeners: { ... },
    multiSelect: true,
    viewConfig: {
        stripeRows: true,
        markDirty: false,
        listeners: { ... }
    },

    features: [Ext.create("Ext.ux.grid.feature.Tileview", {
        getAdditionalData: function(data, index, record, orig) {
            if (this.viewMode) {
                return {
                    name: record.get("name").toLowerCase(),
                };
            }
            return {};
        },
        viewMode: 'tileIcons',   // default view
        viewTpls: {
            tileIcons: [
                '<td class="{cls} ux-tileview-detailed-icon-row">',
                '<table class="x-grid-row-table">',
                    '<tbody>',
                    '<tr>',
                        '<td class="x-grid-col x-grid-cell ux-tileview-icon" style="background-image: url(&quot;...&quot;);">',
                        '</td>',
                        '<td class="x-grid-col x-grid-cell">',
                            '<div class="x-grid-cell-inner">{name}</div>',
                        '</td>',
                    '</tr>',
                    '</tbody>',
                '</table>',
                '</td>'
            ].join(""),

            mediumIcons: [ ... ].join(""),
            largeIcons: [ ... ].join("")
        }
    })]
});

ビューを変更するには、setView()メソッドを使用する必要があります。

grid.features[0].setView("tileIcons");

それが、機能が実際の生活の中でどのように見えるかです。

  • タイル ビューの例:

ここに画像の説明を入力

  • 画像表示の例:

ここに画像の説明を入力


参考文献:

于 2012-10-28T18:10:04.620 に答える
2

私はそんなことはしません。代わりに、カード レイアウトにグリッドとビューを配置します。ビューを使用すると、アイテムごとにほとんどすべてのマークアップを作成できます。簡単な例を次に示します。

Ext.define('Thing', {
    extend: 'Ext.data.Model',
    fields: ['name']
});

Ext.require('*');

Ext.onReady(function() {

    var store = Ext.create('Ext.data.Store', {
        model: Thing,
        data: [{
            name: 'Name 1'
        }, {
            name: 'Name 2'
        }, {
            name: 'Name 3'
        }]
    });

    var gridActive = true;

    var panel = Ext.create('Ext.panel.Panel', {
        renderTo: document.body,
        width: 400,
        height: 400,
        layout: 'card',
        tbar: [{
            text: 'Switch',
            handler: function(){
                var item;
                if (gridActive) {
                    item = panel.items.last();
                } else {
                    item = panel.items.first();
                }
                gridActive = !gridActive;
                panel.getLayout().setActiveItem(item);
            }
        }],
        items: [{
            border: false,
            xtype: 'gridpanel',
            columns: [{
                text: 'Name',
                dataIndex: 'name'
            }],
            store: store
        }, {
            xtype: 'dataview',
            itemTpl: '<b>{name}</b>',
            store: store
        }]
    });

});
于 2012-10-27T23:21:02.397 に答える