extjs4.2 grid编辑验证问题
extjs4.2 grid编辑完后,点击保存按钮调用saveOrUpdateRecord方法,想在该方法内部做校验,record对象跟踪了下,打印出三个record对象,内部属性值也是a,b,c,但是getValue那里打印出来三行都是c,有知道是什么原因吗?实际我想获取指定行的单元格对象
 

 

 
navynju
navynju 原因: 在同一个column中,每一行的editor实际上是复用的,你在编辑完之后,这个editor中实际上还是最后一次的值,所以你对每一行进行遍历,然后取到这个列的editor,取到的值始终是一样的 解决方案: 不要从column的editor中取值,而应该从这个grid的model/store中取值
5 年多之前 回复

6个回答

原因: 在同一个column中,每一行的editor实际上是复用的,你在编辑完之后,这个editor中实际上还是最后一次的值,所以你对每一行进行遍历,然后取到这个列的editor,取到的值始终是一样的

解决方案:
不要从column的editor中取值,而应该从这个grid的model/store中取值

不知道是否是getEditor的默认值造成的
你可以简单测试下

还有你看下每个record值是否正确
col.getEditor(record);

luogx
luogx col.getEditor(record);返回的不对
5 年多之前 回复
luogx
luogx 我看了下,record是正确的,返回的field内部的值不对
5 年多之前 回复
leehuat
leehuat 如果record不正确, 那你要检查下 grid.store.getModifiRecords(); 返回的是否是修改的记录
5 年多之前 回复
luogx
luogx 不正确,和提问的是一样结果
5 年多之前 回复

我不知道,就看着你自己分数还不够5分

这会是什么原因呢,真神奇啊

只有一段合并单元格的,不知道能不能给你点启发
[code="java"]
//合并单元格
com.xxx.xxx.xxx.xxx.mergeCells = function(grid,cols){
var arrayTr=document.getElementById(grid.getId()+"-body").firstChild.firstChild.firstChild.getElementsByTagName('tr');

var trCount = arrayTr.length;
var arrayTd;
var td;
var merge = function(rowspanObj,removeObjs){ //定义合并函数
if(rowspanObj.rowspan != 1){
arrayTd =arrayTr[rowspanObj.tr].getElementsByTagName("td"); //合并行
td=arrayTd[rowspanObj.td-1];
arrayTd[rowspanObj.td-1].style.backgroundColor='#B0E0E6';
td.rowSpan=rowspanObj.rowspan;
td.vAlign="middle";
Ext.each(removeObjs,function(obj){ //隐身被合并的单元格
arrayTd =arrayTr[obj.tr].getElementsByTagName("td");
arrayTd[obj.td-1].style.display='none';

});
}

};

var rowspanObj = {}; //要进行跨列操作的td对象{tr:1,td:2,rowspan:5}

var removeObjs = []; //要进行删除的td对象[{tr:2,td:2},{tr:3,td:2}]
var col;
Ext.each(cols,function(colIndex){ //逐列去操作tr
var rowspan = 1;
var divHtml = null;//单元格内的数值

for(var i=1;i<trCount;i++){ //i=0表示表头等没用的行
arrayTd = arrayTr[i].getElementsByTagName("td");
var cold=0;
// Ext.each(arrayTd,function(Td){ //获取RowNumber列和check列
// if(Td.getAttribute("class").indexOf("x-grid-cell-special") != -1)
// cold++;

// });
col=colIndex+cold;//跳过RowNumber列和check列
if(!divHtml){
divHtml = arrayTd[col-1].innerHTML;
rowspanObj = {tr:i,td:col,rowspan:rowspan}
}else{
var cellText = arrayTd[col-1].innerHTML;
var addf=function(){
rowspanObj["rowspan"] = rowspanObj["rowspan"]+1;
removeObjs.push({tr:i,td:col});
if(i==trCount-1)
merge(rowspanObj,removeObjs);//执行合并函数
};
var mergef=function(){
merge(rowspanObj,removeObjs);//执行合并函数
divHtml = cellText;
rowspanObj = {tr:i,td:col,rowspan:rowspan}
removeObjs = [];
};
if(cellText == divHtml){
if(colIndex!=cols[0]){
var leftDisplay=arrayTd[col-2].style.display;//判断左边单元格值是否已display
if(leftDisplay=='none')
addf();
else
mergef();

}else
addf();

}else
mergef();

}
}
});
};
[/code]

这是浏览器控制台输出的问题,
你的代码没错,实际上你已经获得指定行的单元格对象,

只不过console.log(field.getValue()),打印这句日志时,
浏览器控制台是动态关联js对象,找的是当前最新的"field",所以看起来都是一个值,实际在代码执行过程中是不同值

luogx
luogx 不是浏览器的问题,grid中那三行,假设中文名称那列a没有填写的话,代码中验证startEdit会定位到那个单元格上的,实际上没有启作用
5 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问