对YUI扩展的Gird组件 Part-1


Posted in Javascript onMarch 10, 2007

原文地址

文章日期:2006/9/26

新版的GIRD可以支持远程数据了。分页和远程排序的设置是通俗易懂的,另外一些常用的自定义的参数我会在这篇贴子中说明一下。新论坛的界面(在建设中)就是一个分页和远程排序的好例子,而本文的代码均来自那个例子。

新方法和属性

利用LoadableDatatModel对象(XMLDataModel和JSONDataModel的父类)实现分页和远程排序,有若干种的新方法和属性。
下列变量“dm”指的是DataModel的实例。

方法

  • initPaging(url, pageSize, baseParams) 现实分页的最重要方法。用该方法,你可以一次过地初始化分页。有关参数的资料,请参阅下列相关的属性。例子fourm.js的用法:
    dm.initPaging('topics.php', 20);
  • loadPage(pageNum, callback, keepExisting)加载新的一页。你的回调(callback)将会在数据加载完毕后调用。”keepExisting“决定是否覆盖当前的数据,或者在已有的数据上添加新数据。例子fourm.js的用法:
    // the grid is ready, load page 1 of topics 
    dm.loadPage(1);
  • isPaged()返回分页是否被激活;
  • getTotalRowCount()返回可用的总记录数(the total number of record)XMLDataModel有新的属性“totalTag”,用来获取总行数。总行数由服务器返回生成XML文档中的“totalTag”那个节点取值,这是一个让DataModel知道有多少记录好的方法。如果你想特定某个总数,可以在Gird初始化的时候用getTotalRowCount覆盖(override)总数 forum.js采用默认的方式:
    dm = new YAHOO.ext.grid.XMLDataModel({   
      tagName: 'Topic',   
      totalTag: 'TotalCount',   
      id: 'id',   
      fields: ['title', 'author', 'totalPosts', 'lastPost', 'lastPoster'] 
    });
    另外一种办法:
    dm = new YAHOO.ext.grid.XMLDataModel({   
      tagName: 'Topic',   
    	id: 'id',   
    	fields: ['title', 'author', 'totalPosts', 'lastPost', 'lastPoster'] 
     }); 
    dm.getTotalRowCount = function(){ return 500; //或者是你要的数量 }
  • getPageSize()返回已配置的page size
  • getTotalPages() 用page size和total rows计算出可用页数。
属性
  • pageSize - 每页的记录数。可在initPaging参数中设置或直接设置。
  • pageUrl - 调用的URL,返回数据。可在initPaging参数中设置或直接设置。
// 调用“/data.php”产生所有分页、排序
dm.pageUrl = '/data.php';
//这种方式也不错
dm.initPaging('/foo.php', 50);
  • remoteSort - 类型:Boolean True值激活远程排序。如果你使用initPaging()上面的方法,这个会自动被设置成TRUE,否则默认是false。
  • baseParams - 类型:Object。 由”键、键值name/value “组成的对象,会被包含到每个分页、排序请求。在论坛中我使用了这个传递选择好的forumId到我的数据脚本中:
// 传入已选择好forumId的值,产生所有分页、排序
dm.baseParams['forumId'] = forumId;
  • paramMap -类型 Object。 model添加分页、排序的请求,默认的通过下列参数 :page, pageSize, sortColumn 和 sortDir。如果你不想使用这些参数名字的话可通过map的参数改名。例如:
//"page"改名为"pageNum"
myDataModel.paramMap['page'] = 'pageNum';

把所有功能组合在一起

这是一个创建Gird的过程,和分页代码:

// 限制选区只是一行
sm = new YAHOO.ext.grid.SingleSelectionModel();
// 监听选区改变
sm.addListener('selectionchange', onSelection);

// 创建我们的column model
cm = new YAHOO.ext.grid.DefaultColumnModel([
 {header: "Topic", width: 330}, 
 {header: "Author", width: 100}, 
 {header: "Posts", width: 40}, 
 {header: "Last Post", width: 150}, 
 {header: "Last User", width: 120}
]);
//这个属性设置默认的排序,免得在每个column上设置。
cm.defaultSortable = true;

// 创建数据模型data model。注意"totalTag"条目。它告诉model去寻找该节点下全部的纪录。
dm = new YAHOO.ext.grid.XMLDataModel({
  tagName: 'Topic',
  totalTag: 'TotalCount',
  id: 'id',
  fields: ['title', 'author', 'totalPosts', 'lastPost', 'lastPoster']
});
// 初始化分页
dm.initPaging('topics.php', 20);
//设置我们想转入的附加参数(可作为第三个参数传入到inirPaing)
dm.baseParams = {'forumId': 4};
dm.setDefaultSort(cm, 3, 'DESC');
//当每次新数据加载后,选择GIRD的第一行
dm.addListener('load', sm.selectFirstRow, sm, true);

// 创建grid对象
grid = new YAHOO.ext.grid.Grid('topics-grid', dm, cm, sm);
grid.render();

//分页工具条,下面将会分析
var toolbar = grid.getView().getPageToolbar();
toolbar.addSeparator();
toolbar.addButton({
  className: 'new-topic-button',
  text: "New Topic",
  click: createTopic
});

// 当gird准备好,加载话题的第一项
dm.loadPage(1);

分页工具条 Paging Toolbar

由于分页的按钮较为常用,我决定写一个简易的工具条组件来实现分页。今次发布的YAHOO.ext.Toolbar十分简单,提供了一些方法,用来实现工具条的分页。 按钮的设置靠CSS完成。图标ICON应该是16X16标准图片。如果不是,图片会被切割。 添加按钮的例子:

toolbar.addButton({
  className: 'my-button',
  tooltip: "New Foo",
  click: createFoo
});
在CSS中ENABLE/DISABLED图标:
.my-button{
 background-image: url(../images/foo.gif);
}
.ytb-button-disabled .my-button{
 background-image: url(../images/foo-disabled.gif);
}
创建带文字的ICON(JS写法如上例):
toolbar.addButton({
  className: 'my-button',
  text: "New Foo",
  click: createFoo
});
但CSS写法就有点复杂:
.ytoolbar .my-button{
 background-image: url('images/foo.gif');
 background-position: 0px 0px;
 background-repeat: no-repeat;
 padding-left:18px;
 padding-top:1px;
 width:auto;
 display:block;
}

要自定义一大堆图标的工具条,最好就是css sprite。新版GIRD的分页图标可能就会采用CSS Sprite这种方式。

下一步做的是。。

下一篇帖子我将会说说grid的拖放,以及两个gird之间的拖放。

Jack

Javascript 相关文章推荐
jQuery 表单验证扩展代码(二)
Oct 20 Javascript
基于jquery的二级联动菜单实现代码
Apr 25 Javascript
jquery移除button的inline onclick事件(已测试及兼容浏览器)
Jan 25 Javascript
如何用JavaScript动态呼叫函数(两种方式)
May 03 Javascript
javascript代码运行不出来执行错误的可能情况整理
Oct 18 Javascript
全面理解面向对象的 JavaScript(来自ibm)
Nov 10 Javascript
Flexigrid在IE下不显示数据的有效处理方法
Sep 04 Javascript
jQuery搜索子元素的方法
Feb 10 Javascript
js表单提交和submit提交的区别实例分析
Dec 10 Javascript
剖析Node.js异步编程中的回调与代码设计模式
Feb 16 Javascript
简单实现vue中的依赖收集与响应的方法
Feb 18 Javascript
原生JavaScript实现换肤
Feb 19 Javascript
学习YUI.Ext第七日-View&JSONView Part Two-一个画室网站的案例
Mar 10 #Javascript
学习YUI.Ext 第六天--关于树TreePanel(Part 2异步获取节点)
Mar 10 #Javascript
学习YUI.Ext 第七天--关于View&JSONView
Mar 10 #Javascript
学习YUI.Ext 第六天--关于树TreePanel(Part 1)
Mar 10 #Javascript
学习YUI.Ext第五日--做拖放Darg&Drop
Mar 10 #Javascript
学习YUI.Ext 第四天--对话框Dialog的使用
Mar 10 #Javascript
学习YUI.Ext 第三天
Mar 10 #Javascript
You might like
谏山创故乡大分县日田市水坝将设立《进击的巨人》立艾伦、三笠以及阿尔敏的铜像!
2020/03/06 日漫
检查用户名是否已在mysql中存在的php写法
2014/01/20 PHP
PHP批量上传图片的具体实现方法介绍.
2014/02/26 PHP
php+mysqli批量查询多张表数据的方法
2015/01/29 PHP
PHP实践教程之过滤、验证、转义与密码详解
2017/07/24 PHP
Laravel 修改默认日志文件名称和位置的例子
2019/10/17 PHP
javascript 写类方式之六
2009/07/05 Javascript
javascript中节点的最近的相关节点访问方法
2013/03/20 Javascript
js事件冒泡实例分享(已测试)
2013/04/23 Javascript
javascript实现单击和双击并存的方法
2014/12/13 Javascript
jQuery中hasClass()方法用法实例
2015/01/06 Javascript
JavaScript把数组作为堆栈使用的方法
2015/03/20 Javascript
解析Node.js基于模块和包的代码部署方式
2016/02/16 Javascript
jQuery事件用法详解
2016/10/06 Javascript
javascript 动态样式添加的简单实现
2016/10/11 Javascript
深入理解JS中的Function.prototype.bind()方法
2016/10/11 Javascript
Vue数据驱动模拟实现5
2017/01/13 Javascript
js中获取键盘按下键值event.keyCode、event.charCode和event.which的兼容性详解
2017/03/15 Javascript
学习使用Bootstrap栅格系统
2017/05/11 Javascript
JavaScript ES6箭头函数使用指南
2018/12/30 Javascript
vue.config.js中配置Vue的路径别名的方法
2020/02/11 Javascript
[57:37]EG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
在Python中处理XML的教程
2015/04/29 Python
Python读取文件内容为字符串的方法(多种方法详解)
2020/03/04 Python
Python如何使用队列方式实现多线程爬虫
2020/05/12 Python
python virtualenv虚拟环境配置与使用教程详解
2020/07/13 Python
RentCars.com巴西:汽车租赁网站
2016/08/22 全球购物
Sasa莎莎海外旗舰店:香港莎莎美妆平台
2018/03/21 全球购物
办公室秘书自我鉴定
2014/01/18 职场文书
2014年乡镇植树节活动方案
2014/02/28 职场文书
工业自动化专业自荐信范文
2014/04/10 职场文书
三分钟英语演讲稿
2014/04/24 职场文书
民事诉讼代理授权委托书范本
2014/10/08 职场文书
客户经理岗位职责
2015/01/31 职场文书
党风廉政承诺书2016
2016/03/25 职场文书
redis不能访问本机真实ip地址的解决方案
2021/07/07 Redis