【问题标题】:How to get handle to a cell field in Extjs Grid如何处理 Extjs Grid 中的单元格字段
【发布时间】:2015-01-14 21:42:44
【问题描述】:

网格的数据如下所示:

data: [{
    field1: abc
    field2: [
        {value: 0, label: Blue}, 
        {value: 1, label: Green}
    ]
},
{
    field1: def
    field2: [
        {value: 0, label: Red}, 
        {value: 1, label: Pink}
    ]
}]

网格组件配置类似于:

{
xtype: 'grid',
....
    columns: [
        {
            dataIndex: field1
        },
        {
            dataIndex: field2
            editor: {
                xtype: combobox,
                displayField: label,
                valueField: value,
                store: new someSampleStore();
            }
        }
    ]
}

现在,网格的第 2 列有一个组合框。 对于 Grid 的第 0 行,第 1 列;组合框下拉菜单应显示以下选项:蓝色、绿色 对于 Grid 的第 1 行,第 1 列;组合框下拉菜单应显示以下选项:红色、粉色

我是否需要手动将数据加载到每个组合框(每一行)中,或者有什么方法可以在列定义中指定配置,以便组合框获取“field2”的数据?

【问题讨论】:

  • 我会先看看文档docs.sencha.com/extjs/5.0/5.0.1-apidocs/#!/api/… 尝试做某事,然后再回来专门问一个问题。
  • 对不起,我意识到问题不够清楚。我已经编辑了这个问题。我确实在网格上尝试了 beforecellclick 事件,以便我可以获取该字段并为组合框设置数据。但我无法处理组合框字段。
  • 根据所提供的信息,我猜您最好使用PropertyGrid。定义一些可以在整个应用程序中使用的常见组合框及其存储,例如 Color Combo 并使用它们。通常,当所有行在组合中使用相同的值时,将使用带有组合的编辑器列,这样您只需定义一次并且它们都共享它,例如订单状态组合或类似的东西。

标签: extjs


【解决方案1】:

看看下面的代码。从本质上讲,它可以满足您的需求,但仅在第一次单击后才起作用。我会让你弄清楚的。 ;-)

演示:https://fiddle.sencha.com/#fiddle/gec

Ext.application({
    name: 'Fiddle',

    launch: function() {


        var comboStore = Ext.create('Ext.data.Store', {
            fields: ['value', 'label'],
            data: [{
                name: '',
                value: ''
            }],
            proxy: {
                type: 'memory',
                reader: {
                    type: 'json',
                    rootProperty: 'items'
                }
            }
        });

        Ext.create('Ext.data.Store', {
            storeId: 'employeeStore',
            fields: ['firstname', 'lastname', 'seniority', 'dep', 'hired'],
            data: [{
                firstname: "Michael",
                lastname: "Scott",
                seniority: 7,
                dep: "Management",
                hired: "01/10/2004",
                comboData: [{
                    label: 'Test1',
                    value: 'testval1'
                }, {
                    label: 'Test2',
                    value: 'testval2'
                }, {
                    label: 'Test3',
                    value: 'testval3'
                }]
            }, {
                firstname: "Dwight",
                lastname: "Schrute",
                seniority: 2,
                dep: "Sales",
                hired: "04/01/2004",
                comboData: [{
                    label: 'Dwight1',
                    value: 'testval1'
                }, {
                    label: 'Dwight2',
                    value: 'testval2'
                }, {
                    label: 'Dwight3',
                    value: 'testval3'
                }]
            }, {
                firstname: "Jim",
                lastname: "Halpert",
                seniority: 3,
                dep: "Sales",
                hired: "02/22/2006",
                comboData: [{
                    label: 'Jim1',
                    value: 'testval1'
                }, {
                    label: 'Jim2',
                    value: 'testval2'
                }, {
                    label: 'Jim3',
                    value: 'testval3'
                }]
            }, {
                firstname: "Kevin",
                lastname: "Malone",
                seniority: 4,
                dep: "Accounting",
                hired: "06/10/2007",
                comboData: [{
                    label: 'Kevin1',
                    value: 'testval1'
                }, {
                    label: 'Kevin2',
                    value: 'testval2'
                }, {
                    label: 'Kevin3',
                    value: 'testval3'
                }]
            }]
        });

        Ext.create('Ext.grid.Panel', {
            title: 'Column Demo',
            store: Ext.data.StoreManager.lookup('employeeStore'),
            columns: [{
                text: 'First Name',
                dataIndex: 'firstname',
                editor: {
                    xtype: 'combobox',
                    displayField: 'label',
                    valueField: 'value',
                    store: comboStore,
                    fields: ['value', 'label']
                }
            }, {
                text: 'Last Name',
                dataIndex: 'lastname'
            }, {
                text: 'Hired Month',
                dataIndex: 'hired',
                xtype: 'datecolumn',
                format: 'M'
            }, {
                text: 'Department (Yrs)',
                xtype: 'templatecolumn',
                tpl: '{dep} ({seniority})'
            }],
            selType: 'cellmodel',
            plugins: {
                ptype: 'cellediting',
                clicksToEdit: 1,
                listeners: {
                    beforeedit: function(editor, context, eOpts) {
                        testData = context.record.data.comboData;
                        comboStore.setData(testData);
                    }
                }
            },
            width: 400,
            forceFit: true,
            renderTo: Ext.getBody()
        });
    }
});

【讨论】:

  • 非常感谢 Rob.. 它对我有用.. 关于“它只在第一次点击后才有效”,我设置了 queryMode: 'local' 来修复它。
  • @optimusPrime 很高兴它成功了,并且您能够在第一次点击时解决问题;)
  • 但是,是否可以让每行中的组合框都有自己的存储实例,并在第一次加载网格时为每个实例加载数据?像这样的东西 - 列:[ ... { 标题:下拉,dataIndex:column2 编辑器:{ xtype:'combobox',displayField:'label',valueField:'value',store:new Ext.data.Store ({ fields:[], data: [] }), fields: ['value', 'label'] } } ] 和网格 afterrender 事件 - { get combobox at grid(row[i ],列[1]); // 迭代 { combobox.store.load(data); } }
  • 是的,我想如果您可以很容易地获得对单个组合的引用,那么您可以这样做,但是当您可以重复使用单个商店时,这在资源方面会非常昂贵?跨度>
猜你喜欢
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-05
  • 2017-05-13
  • 1970-01-01
  • 2019-08-19
  • 2020-08-04
相关资源
最近更新 更多