extjs4可编辑表格优化

用过extjs4的同学应该都是奔着其好用的可编辑啊表格去的吧,虽然看着好用,但是用起来却伤痕累累啊。今天针对其最大的一个问题,大量数据(800以上)的表格进行编辑时,特别是在ie下,编辑单元格时,要4,,5秒才能编辑完成,这客户能接受?欲哭无泪吧。我下断点调试,从源码看,冒泡时间太多,最后发现是一个store的set方法占了很多时间。最后就是从extjs的可编辑表格编辑完成的先后事件来进行优化的。简要说明下,下面的代码,可编辑表格组件都是基于公共js封装的,也方便使用和修改,优化代码如下:





Ext.define('AM.view.BaseTreeGrid', {
extend : 'Ext.tree.Panel',
header : false, // **隐藏标题栏
// width: document.documentElement.clientWidth,
// height: document.documentElement.clientHeight,
layout : 'fit',
border : true,
rowLines : true,
columnLines : true,
//renderTo: "containertreegrid",
collapsible : true,
useArrows : true,
rootVisible : false,
multiSelect : true,
singleExpand : false,
viewConfig: {
 markDirty: false,
 loadMask:true
},
plugins : [Ext.create('Ext.grid.plugin.CellEditing', {
clicksToEdit : 1,
listeners: {
        validateedit : function(editor, e) {
if (e.originalValue != e.value) {
e.record.data[editor.context.field] = e.value;
var ttr = $($(editor.context.row).find("td").get(editor.context.column.getIndex()));
var record = e.record;
var fv = editor.context.column.renderer(e.value, e, record);
ttr.find("div").html(fv);
ttr.addClass("x-grid-dirty-cell");
var columns = e.grid.columns;
for (var i=0; i<columns.length; i++) {
if (i==e.colIdx) {
continue;
}
var tc = columns[i];
var tedit = tc.getEditor(record, tc.field);
var tcr = tc.renderer(record.get(tc.dataIndex), tedit, record);
var ttrr = $($(editor.context.row).find("td").get(i));
ttrr.find("div").html(tcr);
}
}
return false;
}
}
})]
});


//公共的树形表格组件
Ext.define('AM.view.BaseTreeGrid', {extend : 'Ext.tree.Panel',header : false, // **隐藏标题栏// width: document.documentElement.clientWidth,// height: document.documentElement.clientHeight,layout : 'fit',border : true,rowLines : true,columnLines : true,//renderTo: "containertreegrid",collapsible : true,useArrows : true,rootVisible : false,multiSelect : true,singleExpand : false,viewConfig: { markDirty: false, loadMask:true},plugins : [Ext.create('Ext.grid.plugin.CellEditing', {clicksToEdit : 1,listeners: {
				//可编辑表格核心优化代码
validateedit : function(editor, e) {//在校验方法事件中,最后返回false,阻止其后面事件的进一步发生,模拟表格编辑可在该方法中完成if (e.originalValue != e.value) {//给store中data赋值
e.record.data[editor.context.field] = e.value;var ttr = $($(editor.context.row).find("td").get(editor.context.column.getIndex()));var record = e.record;//界面上渲染的值,需要手动调用render函数,阻止事件后,是不会自动触发的
var fv = editor.context.column.renderer(e.value, e, record);ttr.find("div").html(fv);ttr.addClass("x-grid-dirty-cell");var columns = e.grid.columns;for (var i=0; i<columns.length; i++) {if (i==e.colIdx) {continue;}var tc = columns[i];var tedit = tc.getEditor(record, tc.field);var tcr = tc.renderer(record.get(tc.dataIndex), tedit, record);var ttrr = $($(editor.context.row).find("td").get(i));ttrr.find("div").html(tcr);}}return false;}}})]});





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 ExtJS2 中,要实现可编辑表格并在编辑时弹出窗口,你可以使用 GridPanel 的编辑插件(EditingGridPanel)和窗口组件(Window)的结合。 首先,你需要创建一个可编辑的 GridPanel,并为其指定一个编辑插件。然后,你可以在编辑事件中弹出一个窗口,让用户进行编辑操作。在窗口中进行的编辑完成后,将更新的数据保存到 GridPanel 中。 以下是一个示例代码,演示如何在 ExtJS2 中实现可编辑表格并弹出窗口进行编辑: ```javascript Ext.onReady(function() { // 创建数据模型 var store = new Ext.data.Store({ fields: ['name', 'email', 'phone'], data: [ { name: 'John Doe', email: 'john@example.com', phone: '123-456-7890' }, { name: 'Jane Smith', email: 'jane@example.com', phone: '987-654-3210' }, // ... ] }); // 创建列模型 var columnModel = new Ext.grid.ColumnModel({ columns: [ { header: 'Name', dataIndex: 'name', editor: new Ext.grid.GridEditor(new Ext.form.TextField()) }, { header: 'Email', dataIndex: 'email', editor: new Ext.grid.GridEditor(new Ext.form.TextField()) }, { header: 'Phone', dataIndex: 'phone', editor: new Ext.grid.GridEditor(new Ext.form.TextField()) } ] }); // 创建 GridPanel var grid = new Ext.grid.EditorGridPanel({ store: store, cm: columnModel, renderTo: Ext.getBody(), clicksToEdit: 1, // 设置为 1,表示单击单元格即可进入编辑状态 plugins: [new Ext.ux.grid.RowEditor()], // 使用 RowEditor 插件 listeners: { afteredit: function(editor, changes, record, rowIndex) { // 单元格编辑完成后触发 var win = new Ext.Window({ title: 'Edit', layout: 'form', items: [ new Ext.form.TextField({ fieldLabel: 'Name', value: record.get('name') }), new Ext.form.TextField({ fieldLabel: 'Email', value: record.get('email') }), new Ext.form.TextField({ fieldLabel: 'Phone', value: record.get('phone') }) ], buttons: [{ text: 'Save', handler: function() { // 保存编辑后的数据 record.set('name', win.getComponent(0).getValue()); record.set('email', win.getComponent(1).getValue()); record.set('phone', win.getComponent(2).getValue()); win.close(); } }] }); win.show(); } } }); }); ``` 在上面的示例中,我们使用了 RowEditor 插件来实现行级别的编辑功能。在 afteredit 事件中,我们弹出了一个窗口,允许用户在窗口中进行编辑操作。在窗口中的 Save 按钮的事件处理程序中,我们将编辑后的数据保存到 GridPanel 中。 请注意,示例中使用了 Ext.form.TextField 来创建文本输入框,你可以根据实际需求使用其他表单组件。 希望这对你有帮助!如有更多问题,请继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值