ExtJs 的rowEditor插件不能对隐藏column起作用,已更改_extjs columnmodel列隐藏无效-程序员宅基地

技术标签: grid  hiden  插件  column  extjs  Extjs  

<pre name="code" class="javascript">Ext.isEmptyArray = function(arr){
var isEmpty = true;
if(Ext.isArray(arr) && arr.length){
for(var i = 0; i < arr.length; i++){
if(Ext.isObject(arr[i])){
isEmpty = Ext.isEmptyObject(arr[i]);
}else if(Ext.isArray(arr[i]) && arr[i].length){
isEmpty = Ext.isEmptyArray(arr[i]);
}else{
isEmpty = Ext.isEmpty(arr[i]);
}
if(!isEmpty) return false;
}
}
return isEmpty;
};
Ext.isEmptyObject = function(obj){
if(Ext.isObject(obj)){
var isEmpty = true;
for(prop in obj){
if(Ext.isObject(obj[prop])){
isEmpty = Ext.isEmptyObject(obj[prop]);
}else if(Ext.isArray(obj[prop]) && obj[prop].length){
isEmpty = Ext.isEmptyArray(obj[prop]);
}else{
isEmpty = Ext.isEmpty(obj[prop]);
}
if(!isEmpty) return false;
}
return isEmpty;
}else if(Ext.isArray(obj)){
return Ext.isEmptyArray(obj);
}else{
return Ext.isEmpty(obj);
}
};
Ext.ns('Ext.ux.grid');
Ext.ux.grid.RowEditor = Ext.extend(Ext.Panel, {
floating: true,
shadow: false,
layout: 'hbox',
cls: 'x-small-editor',
buttonAlign: 'center',
baseCls: 'x-row-editor',
elements: 'header,footer,body',
frameWidth: 5,
buttonPad: 3,
clicksToEdit: 'auto',
monitorValid: true,
focusDelay: 250,
errorSummary: true,
rstColumn:[],
saveText: 'Save',
cancelText: 'Cancel',
commitChangesText: 'You need to commit or cancel your changes',
errorText: 'Errors',
defaults: {
normalWidth: true
},
initComponent: function(){
Ext.ux.grid.RowEditor.superclass.initComponent.call(this);
this.addEvents('beforeedit', 'canceledit', 'validateedit', 'afteredit')
},
init: function(grid){
this.grid = grid;
this.ownerCt = grid;
if (this.clicksToEdit === 2) {
grid.on('rowdblclick', this.onRowDblClick, this)
} else {
grid.on('rowclick', this.onRowClick, this);
if (Ext.isIE) {
grid.on('rowdblclick', this.onRowDblClick, this)
}
}
grid.getStore().on('remove', function() {
this.stopEditing(false)
}, this);
grid.on({
scope: this,
keydown: this.onGridKey,
columnresize: this.verifyLayout,
columnmove: this.refreshFields,
reconfigure: this.refreshFields,
beforedestroy: this.beforedestroy,
destroy: this.destroy,
bodyscroll: {
buffer: 250,
fn: this.positionButtons
}
});
grid.getColumnModel().on('hiddenchange', this.verifyLayout, this, {
delay: 1
});
grid.getView().on('refresh', this.stopEditing.createDelegate(this, []))
},
beforedestroy: function() {
this.stopMonitoring();
this.grid.getStore().un('remove', this.onStoreRemove, this);
this.stopEditing(false);
Ext.destroy(this.btns, this.tooltip)
},
refreshFields: function() {
this.initFields();
this.verifyLayout()
},
isDirty: function() {
var dirty;
this.items.each(function(f) {
if (String(this.values[f.id]) !== String(f.getValue())) {
dirty = true;
return false
}
}, this);
return dirty
},
restoreColumn:function(){
var cm = this.grid.getColumnModel();
for(var i=0;i < this.rstColumn.length;i++){
cm.setHidden(this.rstColumn[i].colIdx,this.rstColumn[i].hidden);
}
},
startEditing: function(rowIndex, doFocus) {
if (this.editing && this.isDirty()) {
this.showTooltip(this.commitChangesText);
return
}
if (Ext.isObject(rowIndex)) {
rowIndex = this.grid.getStore().indexOf(rowIndex)
}
if (this.fireEvent('beforeedit', this, rowIndex) !== false) {
this.editing = true;
var g = this.grid,
view = g.getView(),
row = view.getRow(rowIndex),
record = g.store.getAt(rowIndex);
this.record = record;
this.rowIndex = rowIndex;
this.values = {};
if (!this.rendered) {
this.render(view.getEditorParent())
}
var w = Ext.fly(row).getWidth();
this.setSize(w);
if (!this.initialized) {
this.initFields()
}
var cm = g.getColumnModel(),fields = this.items.items,f,val;
for (var i = 0,count = 0, len = cm.getColumnCount(); i < len; i++) {
var c = cm.getColumnAt(i);
if(c.dataIndex && c.getEditor()){
if(c.hidden){
cm.setHidden(i,false);
this.pushRstColumn(i,!c.hidden);
}
val = this.preEditValue(record, cm.getDataIndex(i));
f = fields[count++];
f.setValue(val);
this.values[f.id] = Ext.isEmpty(val) ? '' : val
}else{
if(!c.hidden){
cm.setHidden(i,true);
this.pushRstColumn(i,!c.hidden);
}
}
}
this.verifyLayout(true);
if (!this.isVisible()) {
this.setPagePosition(Ext.fly(row).getXY())
} else {
this.el.setXY(Ext.fly(row).getXY(), {
duration: 0.25
})
}
if (!this.isVisible()) {
this.show().doLayout()
}
if (doFocus !== false) {
this.doFocus.defer(this.focusDelay, this)
}
}
},
stopEditing: function(saveChanges){
this.editing = false;
this.restoreColumn();
if (!this.isVisible()) return
if (!saveChanges || !this.isValid()) {
this.hide();
this.fireEvent('canceledit', this, !saveChanges);
return
}
var r = this.record,changes = this.getChanges();
if (!Ext.isEmptyObject(changes) && this.fireEvent('validateedit', this, changes, r, this.rowIndex)) {
r.beginEdit();
Ext.iterate(changes, function(name, value){r.set(name, value)});
r.endEdit();
this.fireEvent('afteredit', this, changes, r, this.rowIndex)
}
this.hide()
},
getChanges:function(){
var changes = {},r = this.record,cm = this.grid.colModel,fields = this.items.items;
for (var i = 0,count = 0, len = cm.getColumnCount(); i < len; i++) {
var c = cm.getColumnAt(i);
if(c.dataIndex && c.getEditor()){
var dindex = cm.getDataIndex(i);
if (!Ext.isEmpty(dindex)) {
var oldValue = r.data[dindex],
value = this.postEditValue(fields[count++].getValue(), oldValue, r, dindex);
if (String(oldValue) !== String(value)) {
changes[dindex] = value;
}
}
}
}
return changes;
},
verifyLayout: function(force) {
if (this.el && (this.isVisible() || force === true)) {
var row = this.grid.getView().getRow(this.rowIndex);
this.setSize(Ext.fly(row).getWidth(), Ext.isIE ? Ext.fly(row).getHeight() + 9 : undefined);
var cm = this.grid.colModel,
fields = this.items.items;
for (var i = 0,count = 0, len = cm.getColumnCount(); i < len; i++) {
var c = cm.getColumnAt(i);
if(c.dataIndex && c.getEditor()){
if (!cm.isHidden(i)) {
var adjust = 0;
if (i === (len - 1)) {
adjust += 3
} else {
adjust += 1
}
fields[count].show();
fields[count].setWidth(cm.getColumnWidth(i) - adjust);
} else {
fields[count].hide()
}
count++;
}
}
this.doLayout();
this.positionButtons()
}
},
slideHide: function() {
this.hide()
},
getEditorColumn:function(){
return this.grid.getColumnModel().getColumnsBy(function(c){
 return c.dataIndex && c.getEditor();
});
},
pushRstColumn:function(colIdx,hidden){
this.rstColumn.push({
colIdx:colIdx,
hidden:hidden
});
},
initFields: function() {
var cm = this.grid.getColumnModel(),
pm = Ext.layout.ContainerLayout.prototype.parseMargins;
this.removeAll(false);
this.rstColumn = [];
for (var i = 0, len = cm.getColumnCount(); i < len; i++) {
var c = cm.getColumnAt(i);
if(c.dataIndex && c.getEditor()){
var c = cm.getColumnAt(i),ed = c.getEditor();
if (!ed) {
ed = c.displayEditor || new Ext.form.DisplayField()
}
if (i == 0) {
if (Ext.isIE) {
ed.margins = pm('0 0 2 0')
} else {
ed.margins = pm('0 3 2 1')
}
} else if (i == len - 1) {
ed.margins = pm('0 2 2 1')
} else {
if (Ext.isIE) {
ed.margins = pm('0 0 2 0')
} else {
ed.margins = pm('0 '+ (i < 3 ? i*2 : 5) +' 2 0')
}
}
ed.setWidth(cm.getColumnWidth(i)-1);
ed.column = c;
if (ed.ownerCt !== this) {
ed.on('focus', this.ensureVisible, this);
ed.on('specialkey', this.onKey, this)
}
this.insert(i, ed)
}
}
this.initialized = true
},
onKey: function(f, e) {
if (e.getKey() === e.ENTER) {
this.stopEditing(true);
e.stopPropagation()
}
},
onGridKey: function(e) {
if (e.getKey() === e.ENTER && !this.isVisible()) {
var r = this.grid.getSelectionModel().getSelected();
if (r) {
var index = this.grid.store.indexOf(r);
this.startEditing(index);
e.stopPropagation()
}
}
},
ensureVisible: function(editor) {
if (this.isVisible()) {
this.grid.getView().ensureVisible(this.rowIndex, this.grid.colModel.getIndexById(editor.column.id), true)
}
},
onRowClick: function(g, rowIndex, e) {
if (this.clicksToEdit == 'auto') {
var li = this.lastClickIndex;
this.lastClickIndex = rowIndex;
if (li != rowIndex && !this.isVisible()) {
return
}
}
this.startEditing(rowIndex, false);
this.doFocus.defer(this.focusDelay, this, [e.getPoint()])
},
onRowDblClick: function(g, rowIndex, e) {
this.startEditing(rowIndex, false);
this.doFocus.defer(this.focusDelay, this, [e.getPoint()])
},
onRender: function() {
Ext.ux.grid.RowEditor.superclass.onRender.apply(this, arguments);
this.el.swallowEvent(['keydown', 'keyup', 'keypress']);
this.btns = new Ext.Panel({
baseCls: 'x-plain',
cls: 'x-btns',
elements: 'body',
layout: 'table',
width: (this.minButtonWidth * 2) + (this.frameWidth * 2) + (this.buttonPad * 4),
items: [{
ref: 'saveBtn',
itemId: 'saveBtn',
xtype: 'button',
text: this.saveText,
width: this.minButtonWidth,
handler: this.stopEditing.createDelegate(this, [true])
}, {
xtype: 'button',
text: this.cancelText,
width: this.minButtonWidth,
handler: this.stopEditing.createDelegate(this, [false])
}]
});
this.btns.render(this.bwrap)
},
afterRender: function() {
Ext.ux.grid.RowEditor.superclass.afterRender.apply(this, arguments);
this.positionButtons();
if (this.monitorValid) {
this.startMonitoring()
}
},
onShow: function() {
if (this.monitorValid) {
this.startMonitoring()
}
Ext.ux.grid.RowEditor.superclass.onShow.apply(this, arguments)
},
onHide: function() {
Ext.ux.grid.RowEditor.superclass.onHide.apply(this, arguments);
this.stopMonitoring();
this.grid.getView().focusRow(this.rowIndex)
},
positionButtons: function() {
if (this.btns) {
var g = this.grid,
h = this.el.dom.clientHeight,
view = g.getView(),
scroll = view.scroller.dom.scrollLeft,
bw = this.btns.getWidth(),
width = Math.min(g.getWidth(), g.getColumnModel().getTotalWidth());
this.btns.el.shift({
left: (width / 2) - (bw / 2) + scroll,
top: h - 2,
stopFx: true,
duration: 0.2
})
}
},
preEditValue: function(r, field) {
var value = r.data[field];
return this.autoEncode && typeof value === 'string' ? Ext.util.Format.htmlDecode(value) : value
},
postEditValue: function(value, originalValue, r, field) {
return this.autoEncode && typeof value == 'string' ? Ext.util.Format.htmlEncode(value) : value
},
doFocus: function(pt) {
if (this.isVisible()) {
var index = 0,
cm = this.grid.getColumnModel(),c;
if (pt) {
index = this.getTargetColumnIndex(pt)
}
for (var i = index || 0, len = cm.getColumnCount(); i < len; i++) {
c = cm.getColumnAt(i);
if(c.dataIndex && c.getEditor()){
if (!c.hidden && c.getEditor()) {
c.getEditor().focus();
break
}
}
}
}
},
getTargetColumnIndex: function(pt) {
var grid = this.grid,
v = grid.view,
x = pt.left,
cms = grid.colModel.config,
i = 0,
match = false;
for (var len = cms.length, c; c = cms[i]; i++) {
if (!c.hidden) {
if (Ext.fly(v.getHeaderCell(i)).getRegion().right >= x) {
match = i;
break
}
}
}
return match
},
startMonitoring: function() {
if (!this.bound && this.monitorValid) {
this.bound = true;
Ext.TaskMgr.start({
run: this.bindHandler,
interval: this.monitorPoll || 200,
scope: this
})
}
},
stopMonitoring: function() {
this.bound = false;
if (this.tooltip) {
this.tooltip.hide()
}
},
isValid: function() {
var valid = true;
this.items.each(function(f) {
if (!f.isValid(true)) {
valid = false;
return false
}
});
return valid
},
bindHandler: function() {
if (!this.bound) return false;
var valid = this.isValid();
if (!valid && this.errorSummary) {
this.showTooltip(this.getErrorText().join(''))
}
this.btns.saveBtn.setDisabled(!valid || Ext.isEmptyObject(this.getChanges()));
this.fireEvent('validation', this, valid)
},
lastVisibleColumn: function() {
var i = this.items.getCount() - 1,c;
for (; i >= 0; i--) {
c = this.items.items[i];
if (!c.hidden) {
return c
}
}
},
showTooltip: function(msg) {
var t = this.tooltip;
if (!t) {
t = this.tooltip = new Ext.ToolTip({
maxWidth: 600,
cls: 'errorTip',
width: 300,
title: this.errorText,
autoHide: false,
anchor: 'left',
anchorToTarget: true,
mouseOffset: [40, 0]
})
}
var v = this.grid.getView(),
top = parseInt(this.el.dom.style.top, 10),
scroll = v.scroller.dom.scrollTop,
h = this.el.getHeight();
if (top + h >= scroll) {
t.initTarget(this.lastVisibleColumn().getEl());
if (!t.rendered) {
t.show();
t.hide()
}
t.body.update(msg);
t.doAutoWidth(20);
t.show()
} else if (t.rendered) {
t.hide()
}
},
getErrorText: function() {
var data = ['<ul>'];
this.items.each(function(f) {
if (!f.isValid(true)) {
data.push('<li>', f.getActiveError(), '</li>')
}
});
data.push('</ul>');
return data
}
});
Ext.reg('roweditor', Ext.ux.grid.RowEditor);



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/mychirs/article/details/38898433

智能推荐

C++数据结构-高效排序算法_c++如何对数组值进行排序效率最高-程序员宅基地

文章浏览阅读817次。对于基本的几种排序方法:插入,选择,冒泡。他们的复杂度均为O(n2)。算法运行所需时间增加的速度通常比数组本身增加的速度要快。希尔排序通过将原数组分为及几个子数组,先分别将这几个子数组排序,再把排序好的子数组进行排序,可以大大提高效率,排序方法可使用任意简单排序,这里使用插入排序用伪代码来表示对于h的值的把控,是需要思考的问题。如果h过大,子数组就会过多,即使子数组已经排序好,也无法显著提高效率;反之,如果h过小,子数组的元素就会过多,算法效率也会降低。_c++如何对数组值进行排序效率最高

mysql竖表转横表,横表转竖表_mysql竖表变横表-程序员宅基地

文章浏览阅读1.9k次,点赞2次,收藏9次。SELECT p.姓名p.语文,p.数学,p.英语 from score as a pivot(sum(成绩) for 课程 in(语文,数学,英语)) as p;查询第一行数据,当查询课程列的内容为'语文'时候,then'语文'这个值变为它对应成绩值60,起列名为语文。--竖表转行表使用pivot(这个是sqlserver,mysql不可以使用)第二行数据,课程值为‘数学’时,then'数学'变为70,起列名为数学。无论是横转竖,还是竖转横,原表都不变还是原来的样子。score2,此表为横表。_mysql竖表变横表

【编程马拉松】【019-一笔画】_一笔作画游戏 csdn-程序员宅基地

文章浏览阅读2.6k次。咱们来玩一笔画游戏吧,规则是这样的:有一个连通的图,能否找到一个恰好包含了所有的边,并且没有重复的路径。输入包含多组数据。每组数据的第一行包含两个整数n和m (2≤n, m≤1000),其中n是顶点的个数,m是边的条数。紧接着有m行,每行包含两个整数from和to (1 ≤ from, to ≤ n, from != to),分别代表边的两端顶点。边是双向的,并且两个顶点之间可能不止一条边_一笔作画游戏 csdn

我的隐私计算学习——联邦学习(5)-程序员宅基地

文章浏览阅读963次,点赞19次,收藏22次。联邦迁移学习与值得关注的联邦学习项目、应用方向

每天写bug是一种怎样的体验?_写bug呢-程序员宅基地

文章浏览阅读2.1w次,点赞13次,收藏23次。点击上方“程序员小灰”,选择“置顶公众号”有趣有内涵的文章第一时间送达!本文转载自公众号 小象源 | 小象 文 | 小象君“哥们,又在写bug呢?”据说这是对程序员杀伤力最大的一句话没有之一!之所以如此,那是因为这是句大实话啊!程序员的人生就是bug和debug交织在一起的悲歌尽管每天都要和Bug打交道可你是否知道Bug这个叫法是怎么来的吗?上图中那个黑乎乎的东西就是史上第一个程序Bug_写bug呢

分糖问题_solo和koko是两兄弟-程序员宅基地

文章浏览阅读5.5k次,点赞6次,收藏22次。问题描述Solo和koko是两兄弟,妈妈给了他们一大袋糖,每块糖上都有自己的重量。现在他们想要将这些糖分成两堆。分糖的任务当然落到了大哥Solo的身上,然而koko要求必须两个人获得的糖的总重量“相等”(根据Koko的逻辑),要不然就会哭的。非常不幸的是,koko还非常小,并且他只会先将两个数转成二进制再进行加法,而且总会忘记进位。如当12(1100)加5(101)时: &nbs..._solo和koko是两兄弟

随便推点

vue项目实现导航栏吸顶功能_vue吸顶导航栏-程序员宅基地

文章浏览阅读478次。建立判断条件,如果页面滚动的值超过导航栏的高度navHeight时,将导航栏的position属性值改为fixed,top值可以设置为0px。当页面回到顶端时,需要再次显示为原来默认的状态,所以把导航栏的position值改为默认的static。调用窗口滚动对象window.onscroll事件。当滚动页面的滚动条时会触发scroll里的事件方法。_vue吸顶导航栏

Visual Studio 2008简体中文试用版(90天)变成永久正式版的两种方法-程序员宅基地

文章浏览阅读176次。Visual Studio 2008简体中文试用版(90天)变成永久正式版的两种方法: 一、先安装试用版,然后在“添加或删除程序”里找到VS2008,点“更改/删除”就会看到一个输入序列号的地方,把序列号输进去,点“升级”按钮即可,Team Suite和Professional通用。 二、用UltraISO打开VS的ISO安装文件,把Setup\setup.sdb文件解压缩出来,一定记得..._xmq2y4t3v6xj48yd3k2v6c4wt

Ubuntu Server内核优化提高并发_ubuntu server 系统优化-程序员宅基地

文章浏览阅读3.1k次。设置文件打开句柄数# 查看系统默认的值ulimit -n# 设置最大打开文件数ulimit -n 1000000这样只能在当前 shell 中有效。通过修改配置文件的方式修改程序最大打开句柄数可以永久有效:sudo vim /etc/security/limits.confroot soft nofile 1040000root hard nofile 1040000..._ubuntu server 系统优化

【考研数学】零基础跟「张宇」的几点体会-程序员宅基地

文章浏览阅读302次,点赞3次,收藏8次。(比如我也听了武忠祥老师的课,不得不说某些方法确实让人拍手叫绝,但是一看题呢,该不会的还是不会。这些阶段如果保质保量的完成,在考试里大致对应的分数是 0,80,120,130。但很多人不知道展开到几项,哪些是可以扔掉的,把很简单的题算得很复杂,有的还背了很多不必要的技巧,纯属浪费时间。入门,基础,强化,是递进关系,不能越级!综测会一直持续到备考结束,也就是说将近一年的时间里,它都会通过滚动复习,让你持续保持火热的手感~真的是保姆级了!根据你自己的薄弱低点,针对性地练,哪里不会练哪里,才能吃透,而且省时间。

【翻译+理解】Channel Access Protocal——EPICS Base-3.16版CA协议 - 基本概念_epics ca协议-程序员宅基地

文章浏览阅读2k次。参考文献:1. 官方CA协议说明 https://epics.anl.gov/base/R3-16/1-docs/CAproto/index.html#_concepts(本翻译的原文)2. EPICS培训PPT EPICS_Introduction_PSI2011.ppt https://download.csdn.net/download/u013894429/10823381(找不到..._epics ca协议

基于java和微信小程序的 点餐外卖小程序-后台Java 毕业设计毕设源码最终作品_java外卖小程序源码-程序员宅基地

文章浏览阅读2.2k次,点赞3次,收藏13次。微信小程序在线点餐外卖系统主要包含功能:微信登录、普通用户注册和登录、用户信息修改、用户密码修改;用户首页、菜品分类、产品浏览、增加数量、减少数量、订餐、收藏、地址管理、评论、广告设置等;提供项目源代码(小程序+接口+后台)。开发工具:IDEA2020开发环境:JDK1.8 +Tomcat8数据库:Mysql8小程序后台..._java外卖小程序源码