Buffalo在绑定table时的Bug及解决办法

0 views
Skip to first unread message

aboutibm

unread,
Mar 18, 2008, 10:11:47 PM3/18/08
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='';
}
......

ysixin

unread,
Apr 15, 2008, 3:09:55 AM4/15/08
to buffalo与Amowa
我也碰到这个问题,呵呵,正好解决。
也可以采用tBody.deleteRow来解决

飞羽天关

unread,
Apr 16, 2008, 11:26:49 AM4/16/08
to buffalo与Amowa
是你啊,哈哈

On Apr 15, 3:09 pm, ysixin <ysi...@gmail.com> wrote:
> 我也碰到这个问题,呵呵,正好解决。
> 也可以采用tBody.deleteRow来解决
Reply all
Reply to author
Forward
0 new messages