对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的一些注意
Dec 06 Javascript
一个级联菜单代码学习及removeClass与addClass的应用
Jan 24 Javascript
简单几行JS Code实现IE邮件转发新浪微博
Jul 03 Javascript
JS通过分析userAgent属性来判断浏览器的类型及版本
Mar 28 Javascript
js和jquery如何获取图片真实的宽度和高度
Sep 28 Javascript
jQuery中:radio选择器用法实例
Jan 03 Javascript
JavaScript中利用Array和Object实现Map的方法
Jul 27 Javascript
JS常用正则表达式总结【经典】
May 12 Javascript
vue-lazyload使用总结(推荐)
Nov 01 Javascript
vue中使用mxgraph的方法实例代码详解
May 17 Javascript
Vue 通过公共字段,拼接两个对象数组的实例
Nov 07 Javascript
一文读懂vue动态属性数据绑定(v-bind指令)
Jul 20 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
PHP学习 运算符与运算符优先级
2008/06/15 PHP
PHP 开发环境配置(Zend Studio)
2010/04/28 PHP
解析func_num_args与func_get_args函数的使用
2013/06/24 PHP
destoon实现VIP排名一直在前面排序的方法
2014/08/21 PHP
php生成RSS订阅的方法
2015/02/13 PHP
PHP微信红包API接口
2015/12/05 PHP
PHP XML和数组互相转换详解
2016/10/26 PHP
jQuery获取对象简单实现方法小结
2014/10/30 Javascript
Nodejs学习笔记之Stream模块
2015/01/13 NodeJs
极易被忽视的javascript面试题七问七答
2016/02/15 Javascript
JS实现队列与堆栈的方法
2016/04/21 Javascript
jQuery深拷贝Json对象简单示例
2016/07/06 Javascript
Angular2平滑升级到Angular4的步骤详解
2017/03/29 Javascript
webpack实现热更新(实施同步刷新)
2017/07/28 Javascript
JQuery Ajax跨域调用和非跨域调用问题实例分析
2019/04/16 jQuery
JS学习笔记之原型链和利用原型实现继承详解
2019/05/29 Javascript
vue.js 打包时出现空白页和路径错误问题及解决方法
2019/06/26 Javascript
非常实用的jQuery代码段集锦【检测浏览器、滚动、复制、淡入淡出等】
2019/08/08 jQuery
vue 实现模糊检索并根据其他字符的首字母顺序排列
2019/09/19 Javascript
layui 中select下拉change事件失效的解决方法
2019/09/20 Javascript
将Vue组件库更换为按需加载的方法步骤
2020/05/06 Javascript
webpack+vue.js构建前端工程化的详细教程
2020/05/10 Javascript
纯JS开发baguetteBox.js响应式画廊插件
2020/06/28 Javascript
[01:38]DOTA2辉夜杯 欢乐的观众现场采访
2015/12/26 DOTA
[00:57]辉夜杯战队访谈宣传片—VG
2015/12/25 DOTA
Python开发的单词频率统计工具wordsworth使用方法
2014/06/25 Python
Python随机函数random()使用方法小结
2018/04/29 Python
基于Django静态资源部署404的解决方法
2019/07/28 Python
pytorch自定义初始化权重的方法
2019/08/17 Python
有关pycharm登录github时有的时候会报错connection reset的问题
2020/09/15 Python
寻找迷宫的一条出路,o通路;X:障碍
2016/07/10 面试题
餐饮加盟计划书
2014/01/10 职场文书
校园活动策划书范文
2014/01/10 职场文书
初中三好学生事迹材料
2014/01/13 职场文书
围城读书笔记
2015/06/26 职场文书
国际最新研究在陨石中发现DNA主要成分 或由陨石带来地球
2022/04/29 数码科技