Xin lỗi vì chậm trễ lâu, nhưng cho phép chỉ nói rằng tôi đã đi nghỉ, ngồi trên biển và nhấm nháp Mojitos ... suy nghĩ về cuộc sống, khoai tây và những gì tôi thực sự cần cho lưới dự án sắp tới khôn ngoan. Tôi đã đi đến kết luận về những điểm này:
- Vì trong lưới của tôi, mọi người sẽ viết số. Tôi cần tập trung vào chế độ chỉnh sửa bằng cách nhấn số trong ô hiện tại.
- Tôi cần nhấn phím số không chỉ kích hoạt chế độ chỉnh sửa, nhưng chèn nó làm giá trị mới (do đó bằng cách nhấn 1 trên bàn phím, ô đang nhập chế độ chỉnh sửa và đặt 1 làm giá trị mới)
- Tôi cần để ESC và ENTER ma thuật hoạt động như thường lệ.
Nói chung tôi đã thực hiện một số ghi đè đối với Ext.core.Element (để khắc phục lỗi lạ xuất hiện khi sử dụng IE9 và Firefox 6.0.2 trên Windows 7. Để biết thêm chi tiết, vui lòng xem chú thích trong mã.), Ext.grid .plugin.Editing (để vào chế độ chỉnh sửa bằng cách nhấn các phím số) và Ext.Editor (để đặt giá trị mới).
TODO: khi trong chế độ chỉnh sửa, nhấn ENTER không chỉ chỉnh sửa hoàn chỉnh, nhưng di chuyển xuống một ô nếu có một (tương tự như Excel)
PS. Xin lỗi vì tiếng Anh của tôi ... không thực sự là ngôn ngữ mẹ đẻ của tôi, nhưng hy vọng nó ít nhiều dễ hiểu. Ngoài ra, cảm ơn cho đầu vào và ý kiến! ;)
/**
* 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":"[email protected]", "phone":"555-111-1224"},
{"name":"Bart", "email":"[email protected]", "phone":"555--222-1234"},
{"name":"Homer", "email":"[email protected]", "phone":"555-222-1244"},
{"name":"Marge", "email":"[email protected]", "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], //
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'
});
});
Bạn có thể xác nhận rằng bạn muốn trường trình chỉnh sửa lưới có toàn bộ văn bản được chọn trên tiêu điểm không? Một cái gì đó giống như hành động trên trang được liên kết ở đây nhưng trong lưới? [link] (http://javascript-array.com/scripts/onclick_select_all_text_in_field/) –
vâng, đó là ý tưởng cho nó. – vins
có vẻ như với tôi rằng tôi có thể làm những gì tôi muốn bằng cách sử dụng cấu hình param selectOnFocus: true – vins