JavaScript YUI 2.8: DataTable jquery form 异步请求显示数据分页

YUI Library: 一切关于yui的资料都可以获取
[url]http://developer.yahoo.com/yui/[/url]
上个效果图:
[img]http://dl.iteye.com/upload/picture/pic/53815/c20c1ed6-3770-3f3b-8b0d-3e18bc529781.jpg[/img]
[size=medium]两步走:
1 数据的获取(jquery form动态提交或者jquery ajax异步请求,内容和记录分两次请求):
2 数据的显示:(yahooui datatable)[/size]

[size=large][b]1 数据的获取(jquery form动态提交或者jquery ajax异步请求):[/b][/size]
[size=medium]YAHOOUI提供datasource可以异步去查询数据和数据的总记录数(一次查完),由于
[/size]
 //数据源
this.myDataSource = new YAHOO.util.DataSource(URL);

[size=medium]
URL填写成action的时候跳转不了,可能自己还没有弄清楚,有谁知道请告诉我,
谢谢了.[b]数据获取采用jquery的form动态提交或者js变量作为URL参数进行请求都可以[/b],
但是后者会有中文乱码问题,并且当参数过长的时候URL会变得很长.曾经把参数以
json格式传递过去,只需一个变量,后台直接将json格式参数转换成JavaBean
关于json与java之间的相互转换请看这里,以后补上[/size]
[size=medium]
现在补上了,2010-2-10,点击连接就可以看了[url=http://pouyang.iteye.com/admin/blogs/575245]js变量作为URL参数乱码[/url] [b] 内容数据和分页导航的数据是分两次请求去取的,所以查询条件和page,perPageResults都必须同步的传递过去,否则内容和记录数就不一致[/b]
[/size]
[b]js变量作为URL参数进行传递[/b]
//得到分页内容url 
function getQueryUrl(page) {
var account = document.getElementById("uuser").value;
var name = document.getElementById("uname").value;
var perPageResults = document.getElementById("perPageResults").value;
var backEndUrl = contextPath+"/yuidemo/userManager.do?method=queryByYahoo_1&count=1&account="+account+"&name="+name+"&perPageResults="+perPageResults;
if (typeof page != 'undefined'){
backEndUrl +="&page="+page;
}
return backEndUrl;
}
//内容显示 jquery ajax异步请求
function content(pageUrl){
$.ajax( {
type : "POST",
url : pageUrl,
cache : false,
dataType: "json",
success : showContent
});
}

[b]jquery form的动态提交把page也必须包含进去[/b]
// 内容显示
function content(){
var options = {
dataType: 'json',
url: contextPath+"/yuidemo/userManager.do?method=queryByYahoo_2&count=1",
success: showContent
};
$('#myForm').ajaxForm(options);
$('#myForm').submit();
}

[b]后台处理[/b]

List<UserDTO> list = new ArrayList<UserDTO>();
int page = 1;
if (user.getPage() != null && !"".equals(user.getPage())) {
page = Integer.parseInt(user.getPage());
}
int perPageResults = 10;
if (user.getPerPageResults() != null
&& !"".equals(user.getPerPageResults())) {
perPageResults = Integer.parseInt(user.getPerPageResults());
}
// ROWNUM rowIndex 从1开始不是从0开始
user.setStartRowNum((long) (page - 1) * perPageResults + 1);
user.setEndRowNum((long) page * perPageResults);
list = this.userDao.query(user);
JSONArray json = new JSONArray();
json.clear();
json = JSONArray.fromObject(list);
response.setHeader("X-JSON", json.toString());
response.setCharacterEncoding("UTF-8");
response.setHeader("Cache-Control", "no-cache,must-revalidate");// 清楚缓存
response.setHeader("Pragma", "no-cache"); // HTTP 1.0
response.setDateHeader("Expires", 0); // prevents caching at the
// json.put("data", 1);
response.getWriter().print(json.toString());
return null;

千万不要复制粘贴,我只是说思路而已
[size=large][b]2 数据的显示:(yahooui datatable)[/b][/size]

[size=medium]此处是第一步执行完后的回调函数,这样页面div上就可以显示数据了
这只是最最基本的一点[/size]
function showContent(data){	
alert(data);
YAHOO.widget.DataTable.formatCheckBox = function(elLiner, oRecord,oColumn, oData) {
var value = oRecord.getData("uuid");
elLiner.innerHTML = "<input type='checkbox'value='"+value+"'>";
};
//表头定义
var myColumnDefs = [ {
key : "<input id='www' name='w' value='www' type='checkbox' onclick=\"selectall()\" >全选",
formatter:YAHOO.widget.DataTable.formatCheckBox
}, {
key : "uuid",
label:"用户ID",
sortable : true,
formatter:YAHOO.widget.DataTable.formatNumber
}, {
key : "uuser",
label:"帐号",
sortable : true
}, {
key : "uname",
label:"姓名",
sortable : true
}, {
key : "upassword",
label:"密码",
sortable : true
}, {
key : "urole",
label:"角色",
sortable : true
},{
key : "原因",
formatter : "dropdown",
dropdownOptions : [ "选择", "无此人", "停机", "忙" ],
sortable : false
}
];
//数据源
this.myDataSource = new YAHOO.util.DataSource(data);
//this.myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON;
this.myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSARRAY;
this.myDataSource.responseSchema = {
//resultsList : "userList",
// Use the parse methods to populate the RecordSet with the right data types
fields : [ {
key : "uuid",parser:"number"
}, // this is already string data so no parser needed
{
key : "uuser"
},
{
key : "uname"
},
{
key : "upassword"
},
{
key : "urole"
}
]
};
//数据源与页面div绑定
this.myDataTable = new YAHOO.widget.DataTable("formatting",
myColumnDefs, this.myDataSource);
}


例子:
Spring2.5+ibatis+Struts1 oracle 9.0
导入即可运行

[size=medium]需求变更[/size]
[size=medium][color=red]1--列宽要随便改导入:[/color]
[/size]
<script type="text/javascript" src="../js/dragdrop-min.js"></script>

在列定义中加属性:
resizeable:true,



[size=medium][color=red]2--列字段的值是0的要求在页面上显示的时候是 空白[/color][/size]

在列定义中定义[/size]


//投诉及建议
var renComplainsFormatte = function (el, oRecord, oColumn, oData) {
var renComplains =oRecord.getData('renComplains');
if (renComplains == '0') {
el.innerHTML='';
}
};
//在列定义再加上:
formatter:renComplainsFormatte



[size=medium][color=red]3--在DataTable中下拉列表动态显示[/color][/size]
分两步走

a : 初始化信息放在ServletContext中
主要说下类:
初始化信息放在list中,(属性 -- > 指向list)
list<SelectDTO>
SelectDTO中有属性String value,String text
为什么放在list中,而不是放在map中?(页面上c标签可以循环装DTO的list)

b: 把信息转化成js的Array,在YUI列定义中进行设置
1--ServletContext中的list信息转化成Array
 <script type="text/javascript">
var dropdata = new Array();
//var dropdata = [{'text':'请选择','value':'-1'}];
var first = {'label':'请选择','value':'-1'};
dropdata.push(first);
//dropdata.push(aa);
<c:forEach items="${oyp}" var="item">
var object = new Object();
object.label = "${item.text}";
object.value = "${item.value}";
//dropdata.push({'text':'${item.text}','value':'${item.value}'});
dropdata.push(object);
</c:forEach>

</script>



2--yui中进行设置这个下拉信息Array(在列定义中进行设置)
  {
key : "uname",
sortable : false,
editor: new YAHOO.widget.DropdownCellEditor({dropdownOptions:eval(dropdata), disableBtns:true}),
formatter: function(el, oRecord, oColumn, oData) {
var combo = dropdata;
for (var i = 0;i<combo.length;i++) {
if (oData == combo[i].value) {
el.innerHTML = combo[i].label;
return;
}
el.innerHTML = oData;
}
}

},



[size=medium]附上例子:
[color=red]
Spring2.5+ibatis+Struts1 oracle 9.0
导入即可运行(only a table and a procedure)
[/color] [/size]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值