简体   繁体   English

ExtJs 6.0:使用组合框编辑网格单元-不同步id值

[英]ExtJs 6.0 : Grid Cell Editing with a Combobox - Not Syncing the id value

I'm using a grid with Ext.grid.plugin.CellEditing. 我正在使用带有Ext.grid.plugin.CellEditing的网格。 On the grid, there's a combobox and a date. 在网格上,有一个组合框和一个日期。 The date is syncing correctly, but the combobox is trying to save the id of the combobox in a String description field. 日期正确同步,但是组合框正在尝试将组合框的ID保存在字符串描述字段中。

My combobox has fields codeChecklistItemStatusId (foreign key), and codeChecklistItemStatus (display field for user). 我的组合框具有字段codeChecklistItemStatusId(外键)和codeChecklistItemStatus(用户显示字段)。

When I edit the Checklist Item Status field, the field I've chosen for display field (dataIndex: 'codeChecklistItemStatus') is updated to be an integer. 当我编辑Checklist Item Status字段时,我为显示字段选择的字段(dataIndex:'codeChecklistItemStatus')被更新为整数。 Upon saving, the field codeChecklistItemStatus gets changed from a String description to the new id value, and the field I want to change codeChecklistItemStatusId still has the original id value. 保存后,字段codeChecklistItemStatus从字符串描述更改为新的id值,而我要更改codeChecklistItemStatusId的字段仍具有原始ID值。

All the examples I've found online have a string value being saved instead of an id value. 我在网上找到的所有示例都保存了一个字符串值,而不是一个id值。 Is there any way to change the codeChecklistItemStatusId field instead of codeChecklistItemStatus? 有什么方法可以更改codeChecklistItemStatusId字段而不是codeChecklistItemStatus吗?

I've put dataIndex: 'codeChecklistItemStatusId' in my grid and the grid then displays numbers to the user instead of a description. 我将dataIndex:'codeChecklistItemStatusId'放入网格中,然后网格向用户显示数字而不是描述。 However, when saving the correct field codeChecklistItemStatusId is updated correctly. 但是,保存正确的字段代码时CheckListItemStatusId会正确更新。

The ChecklistItem store: ChecklistItem存储:

Ext.define('gui.store.IspIntakeChecklistItem',
{
extend: 'Ext.data.Store',
model: 'gui.model.IspIntakeChecklistItem',
root: 'data',
proxy:
{
    type: 'ajax',
    api:
    {
        read: 'ispIntakeChecklistItem/search',
        update: 'ispIntakeChecklistItem/quickEdit'
    },
    actionMethods:
    {
        read: 'POST'
    },
    reader:
    {
        type: 'json',
        rootProperty: 'data'
    },
    writer:
    {
        type: 'json',
        allowSingle: false,
        writeAllFields: true
    }
}
});

The CheckListItem model: CheckListItem模型:

Ext.define('gui.model.IspIntakeChecklistItem',
{
extend: 'Ext.data.Model',
fields: [
        {
            name: 'id'
        },
        {
            name: 'codeChecklistItemStatusId'
        },
        {
            name: 'codeChecklistItemStatus'
        },
        {
            name: 'followUpDate'
        }
]
});

The store of the combobox: 组合框的存储:

Ext.define('gui.store.maint.CodeChecklistItemStatus',
{
extend: 'Ext.data.Store',
remoteSort: true,
pageSize: gui.data.Constants.MAX_CODE_RESULTS_IN_GRID,
model: 'gui.model.maint.CodeChecklistItemStatus',
root: 'data',
autoLoad: true,
proxy:
{
    type: 'ajax',
    api:
    {
        read: 'codeChecklistItemStatus/search',
        update: 'codeChecklistItemStatus/updateSortOrder'
    },
    actionMethods:
    {
        read: 'POST'
    },
    reader:
    {
        type: 'json',
        rootProperty: 'data'
    }
}
});

The model of the combobox: 组合框的模型:

Ext.define('gui.model.maint.CodeChecklistItem',
{
extend: 'Ext.data.Model',
fields: [
        {
            name: 'id'
        },
        {
            name: 'activeFlag'
        },
        {
            name: 'description'
        },
        {
            name: 'sortOrder'
        },
        {
            name: 'createDate'
        },
        {
            name: 'createUser'
        },
        {
            name: 'lastUpdDate'
        },
        {
            name: 'lastUpdUser'
        }
]
});

Here are a few of the fields in the grid that has CellEditing enabled: 以下是网格中启用了CellEditing的一些字段:

         {
            text: 'Checklist Item Status',
            itemId: 'codeChecklistItemStatusGridFld',
            dataIndex: 'codeChecklistItemStatus',
            width: 200,
            editor: {
                xtype: 'combobox',                    
                queryMode: 'local',
                valueField: 'id',
                displayField: 'description',
                typeAhead: true,
                forceSelection: true,
                store: 'maint.CodeChecklistItemStatus',
                allowBlank: false
            },
            tdCls: 'editableCell'
        },
        {
            text: 'Follow Up Date',
            dataIndex: 'followUpDate',
            width: 150,
            editor: {
                xtype: 'datefield'
            },
            tdCls: 'editableCell'
        }

My controller function: 我的控制器功能:

quickEditChecklistItem: function(editor, e, eOpts) {
    if (e.originalValue !== e.value) {
        debugger;
        var rec = e.record;
        var store = this.getIspIntakeChecklistItemStore();
        //store.add(rec); 
        store.sync({
            scope: this,
            success: function(batch, options) {

                Ext.create('gui.widget.Notify').success('Checklist Item saved successfully');
            },
            failure: function(batch, options) {
                Ext.create('gui.widget.Notify').failure('failure');
            }
        });
    }
}

A colleague of mine figured out how to do this. 我的一位同事想出了办法。 On the grid all I need to define is the dataIndex for the combobox column: 在网格上,我需要定义的只是combobox列的dataIndex:

{
    xtype: 'editableComboboxGridColumn',
    dataIndex: 'codeChecklistItemStatusId'
},

He created a reusable xtype that will handle all the messy code: 他创建了一个可重用的xtype,它将处理所有混乱的代码:

Ext.define('gui.widget.EditableComboboxGridColumn', {
extend: 'Ext.grid.column.Column',

xtype: 'editableComboboxGridColumn',    
width: 200,
tdCls: 'editableCell',

//Required property: dataIndex
initComponent: function() 
{
    var nameCamel = Utilities.toCamelCase(this.dataIndex);
    nameCamel = Utilities.removeId(nameCamel);

    if (this.text == ' ')
        this.text = Utilities.fieldNameToLabel(this.dataIndex);

    if (!this.itemId)
        this.itemId = Utilities.removeId(this.dataIndex) + "GridFld";

    if (!this.store)
        this.store = 'maint.' + nameCamel;

    if (!this.editor)
    {
        this.editor =
        {
            xtype: 'combobox',                    
            queryMode: 'local',
            valueField: (this.valueField ? this.valueField : 'id'),
            displayField: (this.displayField ? this.displayField : 'description'),
            typeAhead: true,
            forceSelection: true,
            store: this.store,
            allowBlank: false
        }
    }

    if (!this.renderer)
    {
        this.renderer = function (value, metaData, record)
        {
            var editor = metaData.column.getEditor(record);
            var storeRecord = editor.store.getById(value);
            if(storeRecord)
                return storeRecord.data[editor.displayField];
            else
                return null;
        }
    }

    this.callParent(arguments);
}
});

Other code in Utilities.js: Utilities.js中的其他代码:

Ext.define('gui.Utilities',
{
alternateClassName: 'Utilities',
singleton: true,

fieldNameToLabel: function(name)
{
    var nameProper = '';

    for (var i = 0; i < name.length; i++) {
        var character = name.substr(i, 1);
        if (character.toUpperCase() == character)
            nameProper += ' ';

        if (nameProper.length == 0)
            nameProper += character.toUpperCase();
        else
            nameProper += character;
    }
    if (nameProper.indexOf('Code ') == 0)
        nameProper = nameProper.substring(5);

    if (nameProper.length == nameProper.indexOf(' Id') + 3)
        nameProper = nameProper.substring(0, nameProper.length - 3);

    var regex = / Flag$/
    if (regex.test(nameProper))
        nameProper = nameProper.replace(regex, '');

    if (nameProper.indexOf(' Upd ') > -1)
        nameProper = nameProper.replace(' Upd ', ' Update ');

    return nameProper;

},

toCamelCase: function(name)
{
    return name.substring(0, 1).toUpperCase() + name.substring(1);
},

removeId: function(name)
{
    var regex = /\s?Id$/;
    if (regex.test(name))
        name = name.replace(regex, '');

    return name;
}
});

We originally started with this code before developing the generic xtype: 在开发通用xtype之前,我们最初是从以下代码开始的:

renderer : function (value, metaData, record) {             
    var editor = metaData.column.getEditor(record);
    var storeRecord = editor.store.getById(value);
    if(storeRecord)
        return storeRecord.data[editor.displayField];
    else
        return null;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM