ExtJS 4提供的建议,帮助:网格:单元格编辑:自动编辑功能

时间:2011-08-11 13:30:36

标签: javascript extjs extjs4

我搜索了与ExtJS相关的问题并没有找到任何参考,但如果我错过了抱歉提前复制问题。

我想问一些关于如何制作ExtJS 4网格的帮助:单元格编辑:自动编辑功能 - 我的意思是,当我按一个键时我想进入单元格编辑模式(例如,按“ 123“在突出显示的单元格中,文本被替换(如果有),带有”123“)。进入单元格编辑模式时,可以按ENTER或用鼠标单击。

作为基础,我使用Sencha提供的示例:http://dev.sencha.com/deploy/ext-4.0.2a/examples/grid/cell-editing.html

任何提示,指示都会很有意义。

提前致谢! :)

其实我确实部分地解决了我的问题。找到了一种在按键上使单元格可编辑的方法,将selectOnFocus配置参数放入单元格中进行文本选择,现在我需要在单元格中插入第一个char(启动编辑模式)。

它可能不是最美丽的解决方案,但它对我有用:) 这是完整的代码,直到现在。

var tStore = Ext.create('Ext.data.Store', {
    storeId:'simpsonsStore',
    fields:['name', 'email', 'phone'],
    data:{'items':[
        {"name":"Lisa", "email":"lisa@simpsons.com", "phone":"555-111-1224"},
        {"name":"Bart", "email":"bart@simpsons.com", "phone":"555--222-1234"},
        {"name":"Homer", "email":"home@simpsons.com", "phone":"555-222-1244"},
        {"name":"Marge", "email":"marge@simpsons.com", "phone":"555-222-1254"}
    ]},
    proxy: {
        type: 'memory',
        reader: {
            type: 'json',
            root: 'items'
        }
    }
});

var tCellEdit = Ext.create('Ext.grid.plugin.CellEditing', {
    clicksToEdit: 1
});

var tGrid = Ext.create('Ext.grid.Panel', {
    title: 'Simpsons',
    store: tStore,
    columns: [
        {header: 'Name',  dataIndex: 'name', field: 'textfield'},
        {header: 'Email', dataIndex: 'email', flex:1,
            editor: {
                xtype:'textfield',
                allowBlank:false,
                selectOnFocus: true
            }
        },
        {header: 'Phone', dataIndex: 'phone'}
    ],
    selType: 'cellmodel',
    plugins: [tCellEdit],
    listeners: {
        keypress: {
            element: 'el',
            fn: function(iEvent, iElement) {
                iCode = iEvent.getKey();
                if (iCode != undefined && iCode != iEvent.LEFT && iCode != iEvent.RIGHT && iCode != iEvent.UP && iCode != iEvent.DOWN && iCode != iEvent.ENTER && iCode != iEvent.ESC) {
                    var iView = tGrid.getView();
                    var position = iView.selModel.position;

                    tCellEdit.startEditByPosition(position);
                }
            }
        }
    },
    height: 200,
    width: 400,
    renderTo: Ext.getBody()
});

1 个答案:

答案 0 :(得分:9)

很抱歉长时间拖延,但我只想说我正在度假,坐在海边喝着Mojitos ......想着生活,土豆和我真正需要的即将到来的项目网格。我得出了关于这些要点的结论:

  1. 因为在我的网格中,人们会写数字。我需要通过按当前单元格中的数字来专注于进入编辑模式。
  2. 我需要按下数字键不仅激活编辑模式,而是将其作为新值插入(所以按键盘上的1,单元格进入编辑模式并将1作为新值)
  3. 我需要像往常一样让ESC和ENTER魔法工作。
  4. 总的来说,我对Ext.core.Element进行了一些覆盖(修复了在Windows 7上使用IE9和Firefox 6.0.2出现的奇怪错误。有关详细信息,请参阅代码中的注释。),Ext.grid.plugin。编辑(按数字键进入编辑模式)和Ext.Editor(设置新值)。

    TODO:在编辑模式下,按ENTER键不仅可以完成编辑,还可以向下移动一个单元格(类似于Excel)

    PS。对不起我的英语...不是我的母语,但希望它或多或少可以理解。另外,感谢您的意见和建议! ;)

    /**
    * Fix for bug with cursor position in editor grid textfield
    *
    * Bug description: after loading an editor grid which contains a textfield, the cursor / caret is positioned at the
    * beginning of text field the first time the editor is activated. Subsequent activations position the caret at the end
    * of the text field.
    * In my case this behavior is not observed in Opera 11.51 (Windows 7) and IE8, Firefox 6.0.2 (Windows XP), but observed in IE9 and Firefox 6.0.2 (Windows 7)
    *
    * Current fix helps with IE9 problem, but Firefox 6.0.2 (Windows 7) still putting the cursor / caret at the beginning of text field.
    *
    * Forum post for ExtJS v3 about same problem and where the fix was found: http://www.sencha.com/forum/showthread.php?88046-OPEN-3.1-Caret-Cursor-Position-in-Editor-Grid-Textfield
    */
    Ext.core.Element.prototype.focus = function(defer, /* private */dom) {
        var me = this,
            dom = dom || me.dom;
        try {
            if (Number(defer)) {
                Ext.defer(me.focus, defer, null, [null, dom]);
            } else {
                dom.focus();
                // start override
                dom.value = dom.value;
                dom.focus();
                if (dom.sof) {
                    dom.select();
                }
                // end override
            }
        } catch (e) { }
        return me;
    };
    /**
    * END OF ALL FIXES
    */
    
    var tStore = Ext.create('Ext.data.Store', {
        storeId:'simpsonsStore',
        fields:['name', 'email', 'phone'],
        data:{'items':[
            {"name":"Lisa", "email":"lisa@simpsons.com", "phone":"555-111-1224"},
            {"name":"Bart", "email":"bart@simpsons.com", "phone":"555--222-1234"},
            {"name":"Homer", "email":"home@simpsons.com", "phone":"555-222-1244"},
            {"name":"Marge", "email":"marge@simpsons.com", "phone":"555-222-1254"}
        ]},
        proxy: {
            type: 'memory',
            reader: {
                type: 'json',
                root: 'items'
            }
        }
    });
    
    Ext.onReady(function() {
    
        var newValue = '';
    
        /**
         *  Rewriting class Ext.grid.pluging.Editing to make cell go into edit mode by pressing numeric keys.
         *
         * changed: requirements: Ext.util.KeyNav -> Ext.util.KeyMap
         * changed: accordingly made changes to use Ext.util.KeyMap in initEditTriggers function
         * added: new function onNumberKey for replacing original value with new one and entering cell in edit mode
         *
         * tested only for Cell selection model, too lazy for Row selection model testing :P
         */
        Ext.override(Ext.grid.plugin.Editing, {
    
            requires: [
                'Ext.grid.column.Column',
                'Ext.util.KeyMap'
            ],
    
            initEditTriggers: function() {
                var me = this,
                    view = me.view,
                    clickEvent = me.clicksToEdit === 1 ? 'click' : 'dblclick';
    
                // Start editing
                me.mon(view, 'cell' + clickEvent, me.startEditByClick, me);
                view.on('render', function() {
                    me.keyNav = Ext.create('Ext.util.KeyMap', view.el, [
                        {
                            key: [48, 49, 50, 51, 52, 53, 54, 55, 56, 57],  // 0123456789
                            fn: me.onNumberKey,
                            scope: me
                        }, {
                            key: 13,    // ENTER
                            fn: me.onEnterKey,
                            scope: me
                        }, {
                            key: 27,    // ESC
                            fn: me.onEscKey,
                            scope: me
                        }
                    ]);
                }, me, { single: true });
            },
    
            onNumberKey: function(e) {
                var me = this,
                    grid = me.grid,
                    selModel = grid.getSelectionModel(),
                    record,
                    columnHeader = grid.headerCt.getHeaderAtIndex(0);
    
                // Calculate editing start position from SelectionModel
                // CellSelectionModel
                if (selModel.getCurrentPosition) {
                    pos = selModel.getCurrentPosition();
                    record = grid.store.getAt(pos.row);
                    columnHeader = grid.headerCt.getHeaderAtIndex(pos.column);
                }
                // RowSelectionModel
                else {
                    record = selModel.getLastSelected();
                }
    
                // if current cell have editor, then save numeric key in global variable
                ed = me.getEditor(record, columnHeader);
                if (ed) {
                    newValue = String.fromCharCode(e);
                }
    
                // start cell edit mode
                me.startEdit(record, columnHeader);
            }
    });
    
        Ext.override(Ext.Editor, {
            startEdit : function(el, value) {
                var me = this,
                    field = me.field;
    
                me.completeEdit();
                me.boundEl = Ext.get(el);
                value = Ext.isDefined(value) ? value : me.boundEl.dom.innerHTML;
    
                if (!me.rendered) {
                    me.render(me.parentEl || document.body);
                }
    
                if (me.fireEvent('beforestartedit', me, me.boundEl, value) !== false) {
                    me.startValue = value;
                    me.show();
                    field.reset();
                    field.setValue((newValue != '' ? newValue : value));
                    me.realign(true);
                    field.focus(false, 10);
                    if (field.autoSize) {
                        field.autoSize();
                    }
                    me.editing = true;
    
                    // reset global newValue
                    newValue = '';
                }
            }
        });
        /**
         *  END OF ALL OVERRIDES (thank god!) :)
         */
    
    
        var tCellEdit = Ext.create('Ext.grid.plugin.CellEditing', {
            clicksToEdit: 1
        });
    
        var tGrid = Ext.create('Ext.grid.Panel', {
            title: 'Simpsons',
            store: tStore,
            columns: [
                {header: 'Name',  dataIndex: 'name',
                    editor: {
                        xtype: 'textfield',
                        maskRe: /[\d]/
                    }
                },
                {header: 'Email', dataIndex: 'email', flex:1,
                    editor: {
                        xtype:'textfield'
                    }
                },
                {header: 'Phone', dataIndex: 'phone'}
            ],
            selType: 'cellmodel',
            plugins: [tCellEdit],
            height: 200,
            width: 400,
            renderTo: 'testgrid'
        });
    });