0

カスタムレンダラーを備えた ExtJs EditorGridPanel があります。基本的な考え方は、項目を登録する必要がある場合はチェックボックスを表示し、項目が既に登録されている場合は Registered というテキストを表示することです。ヘッダーをクリックすると、グリッド全体が再レンダリングされ、すべてのセルがトグルすることを除いて、すべてが順調に機能しています。さらに、ソートは機能しません。すべてのチェックボックスがトグルしないように、ヘッダーがクリックされたことを確認するにはどうすればよいですか? 列の並べ替えを修正するにはどうすればよいですか? 現在、ソートされていません。よろしくお願いします。

var colModel = new Ext.grid.ColumnModel(
    {
    columns: [
        { id: 'ItemOid', header: "ItemOid", width: 100, sortable: true, locked: true, dataIndex: 'ItemOid', hidden: true },
        { id: 'nNumber', header: "N-#", width: 100, sortable: true, locked: true, dataIndex: 'NNumber' },
        { header: "Make", width: 150, sortable: true, dataIndex: 'Make' },
        { header: "Model", width: 150, sortable: true, dataIndex: 'Model' },
        { header: "Register",
            width: 55,
            sortable: true,
            dataIndex: 'Register',
            xtype: 'checkcolumn',
            renderer: renderFunction
        }
    ]
    });

function renderFunction(value, metaData, record, rowIndex, colIndex, store) {

    if (!store.getAt(rowIndex).data['ItemNeedsRegistered'])
        return 'Registered';

    var isRegistered = store.getAt(rowIndex).data['Registered'];
    var renderString;

    if (initialItemRender || isRegistered) {
        renderString = '<input type="checkbox" id="chkRegistered' + rowIndex + '" />';
        store.getAt(rowIndex).data['Registered'] = false;
    } else {
        renderString = '<input type="checkbox" checked="yes" id="chkRegistered' + rowIndex + '" />';
        store.getAt(rowIndex).data['Registered'] = true;
    }

    return renderString;
}

var grid = new Ext.grid.EditorGridPanel({
        store: itemStore,
        cm: colModel,
        sm: new Ext.grid.RowSelectionModel({ singleSelect: true }),
        viewConfig: {
            forceFit: true
        },
        height: 100,
        split: true,
        region: 'north'
    });

これは、基になる値を更新しようとしても失敗する2回目の試みであり、チェックもチェックも解除されません。

function renderFunction(value, metaData, record, rowIndex, colIndex, store) {

    if (!store.getAt(rowIndex).data['ItemNeedsRegistered'])
        return 'Registered';

    var isRegistered = store.getAt(rowIndex).data['Registered'];
    var renderString;

    if (initialItemRender || !isRegistered) {
        renderString = '<input type="checkbox" id="chkRegistered' + rowIndex + '"' 
        + ' onClick="updateStoreOnClick(' + rowIndex + ', true);"'
        + ' />';
    } else {
        renderString = '<input type="checkbox" checked="yes" id="chkRegistered' + rowIndex + '"'
        + ' onClick="updateStoreOnClick(' + rowIndex + ', false);"'                
        + ' />';
    }

    return renderString;
}

function updateStoreOnClick(rowIndex, value) {
    store.getAt(rowIndex).data['Registered'] = value;
}
4

3 に答える 3

1

Registeredレンダリング中に各レコードの属性を直接更新しているため、トグルの問題が発生しています。次にグリッドをレンダリングすると (ソート時など)、すべてのレコードのRegistered属性の値は、最初とは逆のブール値になります。おそらくレンダリング中にこれらの属性を変更するべきではありませんが、代わりに、保存する直前にチェックボックスから正しい値を取得する方法を見つけてください。

並べ替えの場合、並べ替え専用の半任意の値を含む数値属性をレコードに手動で作成できます。たとえば、属性RegisteredSortを呼び出して、次の値を指定します。

  • 1 — 登録を必要としないアイテム
  • 2 — 登録済みアイテム
  • 3 — 未登録のアイテム

次に、RegisteredSort属性をdataIndexではなく、その列の として使用しますRegistered

于 2012-07-20T15:43:17.040 に答える
0

カスタムチェック列を作成しました:

    //#region Custom Check Column
    AVRMS.AircraftRegisterCheckColumn = Ext.extend(Ext.grid.Column, {
    /**
        * @private
        * Process and refire events routed from the GridView's processEvent method.
        */
        processEvent: function(name, e, grid, rowIndex, colIndex) {
            if (name == 'mousedown') {
                var record = grid.store.getAt(rowIndex);

                if (grid.store.getAt(rowIndex).data['AircraftNeedsRegistered'])
                    record.set(this.dataIndex, !record.data[this.dataIndex]);

                return false; // Cancel row selection.
            } else {
                return Ext.grid.ActionColumn.superclass.processEvent.apply(this, arguments);
            }
        },

        renderer: function(v, p, rec, rowIndex, colIndex, store) {
            if (!store.getAt(rowIndex).data['AircraftNeedsRegistered'])
                return store.getAt(rowIndex).data['Status'];

            p.css += ' x-grid3-check-col-td';
            return String.format('<div class="x-grid3-check-col{0}">&#160;</div>', v ? '-on' : '');
        },

        // Deprecate use as a plugin. Remove in 4.0
        init: Ext.emptyFn
    });

    Ext.reg('airRegChkCol', AVRMS.AircraftRegisterCheckColumn);

    // register ptype. Deprecate. Remove in 4.0
    Ext.preg('airRegChkCol', AVRMS.AircraftRegisterCheckColumn);

    // register Column xtype
    Ext.grid.Column.types.airRegChkCol = AVRMS.AircraftRegisterCheckColumn;

    //#endregion

//#region ColumnModel
var colModel = new Ext.grid.ColumnModel(
    {
        columns: [
            { id: 'AircraftOid', header: "AircraftOid", width: 100, sortable: true, locked: true, hideable: false, dataIndex: 'AircraftOid', hidden: true, menuDisabled: true },
            { id: 'nNumber', header: "N-Number", width: 75, sortable: true, locked: true, hideable: false, dataIndex: 'NNumber', menuDisabled: true },
            { header: "Make", width: 150, sortable: true, hideable: false, dataIndex: 'Make', menuDisabled: true },
            { header: "Model", width: 150, sortable: true, hideable: false, dataIndex: 'Model', menuDisabled: true },
            {
                header: "Airworthy",
                width: 75,
                sortable: true,
                hideable: false,
                dataIndex: 'Airworthy',
                menuDisabled: true,
                renderer: function (value, metaData, record, rowIndex, colIndex, store) {
                    if (value == true)
                        return 'Yes';
                    return 'No';
                },
                editor: new Ext.form.ComboBox({
                    id: 'makeCombo',
                    typeAhead: true,
                    store: airworthy,
                    triggerAction: 'all',
                    forceSelection: true,
                    mode: 'local',
                    allowBlank: false,
                    selectOnFocus: true,
                    lazyRender: true,
                    listClass: 'x-combo-list-small'
                })
            },
            {
                id: 'Register',
                header: "Select to Register",
                width: 75,
                sortable: true,
                dataIndex: 'Register',
                xtype: 'airRegChkCol',
                hideable: false,
                menuDisabled: true
            }]
    });


//#endregion

//#region grid
var grid = new Ext.grid.EditorGridPanel({
    store: aircraftStore,
    cm: colModel,
    sm: new Ext.grid.RowSelectionModel({ singleSelect: true }),
    viewConfig: {
        forceFit: true
    },
    height: 100,
    split: true,
    region: 'north'
});
//#endregion
于 2013-01-24T12:49:19.337 に答える
0

ヘッダーをクリックするとrowIndexが0になると思います...

if(rowIndex == 0) return;

renderFunction の先頭に?

于 2012-07-20T14:57:58.953 に答える