aboutibm
unread,Mar 18, 2008, 10:11:47 PM3/18/08Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to buffalo与Amowa
Buffalo在绑定table时的Bug及解决办法
Buffalo版本:Buffalo.VERSION="2.0";
问题再现:
在调用Buffalo.Bind.bind绑定table时,jHeight为3,即table第一行为表头,第二行为奇数行样式,第三行为偶数行样
式,第一次读取数据行数为3,没有问题,但是第二次(以此类推)返回的数据行数如果小于2,比如数据只有一行,就会留下上次数据的第二行没有被删除掉,
正常情况是应该出现一行数据,但是却出现了两行数据,第二行是上次数据遗留下来的第二行,又比如当返回的数据行数为0,期待的应该是没有数据行出现,但
是会出现上次数据的前两行,总的来说就是当jHeight为3时,如果数据小于两行,就会出现删除不干净的情况.
分析:
看了下原代码,在分析buffalo.js里的"bindTable: function(elem, value) "这个函数发现了其绑定的实现是
每次绑定时,先删除掉除了一二三行以外的所有行(jHeight为3时),第二三行直接取原来表格的第二三行,后面的行按奇偶克隆二三行,采取了先删除
多余行,再添加和返回的数据长度一样的行,再填充数据的办法,这时候问题就来了,因为其添加的行数是按照返回的数据长度添加的,如果返回的数据行数小于
2,比如只有一行,那么,绑定时就会先删除原来数据的所有行,剩下前三行,然后往里面填充数据,因为只有一行数据,故只有第一行的数据(也就是表格的第
二行)被更新,第二行数据(也就是表格的第三行)没有被删除掉,依然是上次的数据的第二行(也就是表格的第三行),以此类推,当返回数据的长度为0时,
就会出现上次遗留的两行数据,而不是出现期待的数据行为空,同理,当jHeight为2时也会出现该情况.
解决办法:
在尽量不影响源代码的指导下,我采取了隐藏多余行的办法可以完美解决:
在buffalo.js里的bindTable: function(elem, value)中(大概在760行左右):
1.if (jHeight == 2) {//加上下面5行
if(value.length==0){//没有值
tBody.rows[1].style.display='none';
}else{
tBody.rows[1].style.display='';
}
......
2.if (jHeight >= 3) {//加上下面10行
if(value.length==0){//没有值
tBody.rows[1].style.display='none';
tBody.rows[2].style.display='none';
}else if(value.length==1){//有一行值
tBody.rows[2].style.display='none';
tBody.rows[1].style.display='';
}else{
tBody.rows[1].style.display='';
tBody.rows[2].style.display='';
}
......