论坛首页 AJAX版 Buffalo

buffalo 与table 绑定的的问题

浏览 980 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
时间:2007-08-29
person.jsp页面


<%@ page language="java" contentType="text/html; charset=GBK"
pageEncoding="GBK"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://
www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<script language="JavaScript" src="../js/prototype.js"></script>
<script language="JavaScript" src="../js/buffalo.js"> </script>
<script language="JavaScript" src="../js/common.js"> </script>
<title>信息查询</title>
</head>


<body>
<div style="text-align:center;font-size:18px;">个人信息管理</div><br /><br /




<div align="center" >请输入查询的工号:<input type="text" id="number"
style="width:150px" onblur="bindTable(table1)"/></div><br />
<table width="100%" border="1" id="table1" align="center" jheight="1"
cellpadding="0" cellspacing="0">
<tr>
<td>工号</td>
<td>姓名</td>
<td>性别</td>
<td>年龄</td>
<td>电话号码</td>
<td>家庭地址</td>
</tr>
<tr>
<td jtext="id">id</td>
<td jtext="name">name</td>
<td jtext="sex">sex</td>
<td jtext="age">age</td>
<td jtext="phone">phone</td>
<td jtext="address">address</td>
</tr>
</table>
</body>
</html>

common.jsp


function bindTable(tableId){
var END_POINT="../bfapp";
var buffalo=new Buffalo(END_POINT);
var number = document.getElementById("number").value;
buffalo.remoteCall("PersonInformation.getInformation", [number],
function(reply) {
if (!reply.isFault()){
var array=reply.getResult();
Buffalo.bind(tableId,array);
}
});
}
希望各位指点。
   
时间:2008-04-10
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='';
}
......
   
0 请登录后投票
论坛首页 AJAX版 Buffalo

跳转论坛:
JavaEye推荐
    快速回复 引用上一条消息 (Alt+S)