YUI3下widget的plugin开发

最近在尝试使用YUI3重建ExtFrame框架,使用YUI3做为更佳的UI和JS支持

和ExtJS比,YUI3的UI看起来缺少了足够的UI控件,但是,YUI3的widget开发更灵活(也更难掌握),YUI3的widget操作更多的基于DOM封装的Yui Node而不是象ExtJS一样基于Component,扩展性更灵活

在尝试将一些逻辑封装到YUI的DataTable里时遇到了点问题,在ExtJS里,可以直接通过Ext.extend建立Ext.Grid的子件,并向子件里添加属性和方法,这样,可以直接调用生成的子件就可以了,但是YUI3的widget在使用Y.Extend后,UI完全没能被正常渲染出来

经过上论坛咨询,老外给了些意见,可以使用Y.Base.create来创建子件,但是同样失败了,并且有人说子件不能正确渲染可能是widget名称相关的BUG,但是这可能需要相关开发人员来检测

然后老外给的意见是使用plugin技术,并给了2个demo网页,仔细看了后,确实是个不错的主意,并且尝试建立自己的plugin后确认,YUI3的plugin确实是个好东西

第一个demo是DataTableFooter,在表格下面增加了一行统计的页脚,https://github.com/stlsmiths/YUI3-datatable-footer,这个demo确实不错,但是有点老,里面的DataTable版本其实已经被大幅度修正过了(生成的表格的HTML代码都和现在版本不一样,应当是过期版本),很多代码已经不能在现在版本下正确运行,照着写了些东西后调试修改了好几天才能正确运行

第二个demo地址是http://blunderalong.com/yui,里面有很多DataTable的扩展,其中的Paginator Model-View就是翻页和自动读取数据的Demo,不过这个demo修改了DataTable内核,一旦引入,页面上所有DataTable都会自动使用,而不能分开

最后还是以第一个demo为基础,编写了2个DataTable的plugin

YUI3的plugin技术,简单说就是为widget提供一个接口,当widget进行renderUI、syncUI等动作或事件时,plugin可以进行相应并动作

第一个plugin是为DataTable增加checkbox功能

标准的DataTable的checkbox功能,是在创建时为column列增加checkbox列配置

http://yuilibrary.com/yui/docs/datatable/datatable-chkboxselect.html

var table = new Y.DataTable({columns : [{   key:        'select',allowHTML:  true, // to avoid HTML escapinglabel:      '<input type="checkbox" class="protocol-select-all" title="Toggle ALL records"/>',formatter:      '<input type="checkbox" checked/>',emptyCellValue: '<input type="checkbox"/>'},{   key: 'port',   label: 'Port No.' },{   key: 'pname',  label: 'Protocol' },{   key: 'ptitle', label: 'Common Name' }],data      : ports,scrollable: 'y',height    : '250px',sortable  : ['port','pname'],sortBy    : 'port',recordType: ['select', 'port', 'pname', 'ptitle']
}).render("#dtable");

之所以编写checkboxplugin,是因为我在视图将columns全部通过配置来动态生成,而checkbox写到配置里是比较麻烦的

修改后的代码是这样的:

        var table = new Y.DataTable({columns: Y.TableConfig.Get('plan'),scrollable: 'y',height: '200px',data: ports}).plug(Y.DataTablePlugin.CheckboxPlugin).render('#dtable');

这样,通过自己编写的TableConfig获取配置的column信息(以后页面上编写脚本时无需再编写繁琐的column参数),再通过checkboxplugin生成checkbox列
这个写法和原本Datatable设计有点不同的地方时,在遇到特殊格式时,columns列是通过formatter参数指定格式或格式化的function,而我的设计里不在前台处理,所以特殊的格式都放到后台生成数据后使用对应的render来处理

checkboxplugin是这样写的

    function CheckboxPlugin(config) {CheckboxPlugin.superclass.constructor.apply(this, arguments);};Y.mix(CheckboxPlugin, {NAME: 'checkboxPlugin',NS: 'checkboxplugin',ATTRS: {place: {value: 0,validator: Y.Lang.IsNumber}}});Y.extend(CheckboxPlugin, Y.Plugin.Base, {initializer: function() {var dt = this.get('host');dt.addColumn(checkbox, this.get('place'));dt.delegate("click", function(e) {var checked = e.target.get('checked') || undefined;this.getRecord(e.target).set('select', checked);this.get('contentBox').one('.protocol-select-all').set('checked', false);}, ".yui3-datatable-data .yui3-datatable-col-select input", dt);dt.delegate('click', function(e) {var checked = e.target.get('checked') || undefined;this.data.invoke('set', 'select', checked, { silent: true });this.syncUI();}, '.protocol-select-all', dt);}});Y.namespace('DataTablePlugin');Y.DataTablePlugin.CheckboxPlugin = CheckboxPlugin;

可以看到,这样写的另一个好处是已经自动将全选事件封装进去了,无需每个datatable创建后再添加一次此事件
从上面代码可以看出,plugin的基础写法很简单,主要是在扩展Y.Plugin.Base时,在initialize事件里写出额外的动作来

在initialize事件里,也可以为host的datatable添加render等事件响应

写法是:this.afterHostMethod('方法名', 方法)或this.afterHostEvent('事件名', 方法)

也可以使用beforeHostMethod或onHostEvent

一般widget就三个主要事件:renderUI,syncUI,bindUI,方法主要是render等

下面是我参考编写的DataTableFooter,用来翻页的,不过这个plugin不能单独工作,需要和DataReaderPlugin协调(还没写好),目前也就完成了UI部分

    function DataTablePageBar(config) {DataTablePageBar.superclass.constructor.apply(this, arguments);};Y.mix(DataTablePageBar, {NAME: 'dataTablePageBar',NS: 'pageBarPlugin',ATTRS: {place: {value: 0,validator: Y.Lang.IsNumber},fixed: {value: false,validator: YLang.isBoolean},info: {value: {pagecount: 1,currentpage: 1,totalcount: 1},setter: function(val) {this._tfootThNode.one('.page').set('text', '第' + val.currentpage + '页/共' + val.pagecount + '页 ' + val.totalcount + '条记录');return val;}}}});Y.extend(DataTablePageBar, Y.Plugin.Base, {_tfootContainer: null,_tfootNode: null,_tfootTrNode: null,_tfootThNode: null,initializer: function() {this.afterHostMethod("render", this.renderPluginUI);},renderPluginUI: function() {var dt = this.get(HOST),hdg = this.get(FOOT_HDG),tfootParent = dt._parentNode;if (dt.get("contentBox").one(".yui3-datatable-y-scroller-container")) {this._tfootNode = dt.get("contentBox").one(".yui3-datatable-y-scroller-container").appendChild(YCreate("<table width='100%'/>")).appendChild(YCreate("<tfoot/>"));}else {this._tfootNode = dt.get("contentBox").one(".yui3-datatable-table").appendChild(YCreate("<tfoot/>"));}this._tfootTrNode = this._tfootNode.appendChild(YCreate("<tr/>"));this._tfootThNode = this._tfootTrNode.appendChild(YCreate("<th colSpan='" + dt.get('columns').length + "'/>"));this._tfootThNode.addClass('yui3-datatable-ftth');this._tfootThNode.appendChild(YCreate('<span><a class="firstpage" href="#"><img src="../image/page-first.gif" /></a></span><span><a class="prevpage" href="#"><img src="../image/page-prev.gif" /></a></span><span><a class="nextpage" href="#"><img src="../image/page-next.gif" /></a></span><span><a class="lastpage" href="#"><img src="../image/page-last.gif" /></a></span><span class="page"></span><span class="jump">跳转到第<input type="text" style="width:20px" maxlength="3">页<a class="jumppage" href="#"><image src="../image/go.gif" /></a></span>'));}});

说明:YCreate就是Y.Node.Create,另外还有行代码 Y.DataTablePlugin.PageBarPlugin = DataTablePageBar;在最后
中间创建tfoot的代码,原来那个demo已经太老完全不对,通过检查生成的html后修改成为现在的样子,有无scroll时写法是不一样的

 最后效果图

转载于:https://www.cnblogs.com/zuxOK/archive/2012/11/09/2762106.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409422.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

雅可比行列式_夏七八写:关于“斜二测画法”与雅可比行列式的关系的想法

最开始思考这两种有没有关系的时候也是偶然&#xff0c;&#xff0c;受到启发&#xff1a;雅可比行列式有什么意义呢&#xff0c;为什么对于像 的式子为什么要其后乘上一个雅可比行列式的绝对值呢&#xff1f;在说我的想法之前&#xff0c;我想可能要先提一下一些预备知识&…

linux6.7能升级6.8吗,CentOS 六、7升级gcc至4.八、4.九、5.二、6.三、7.3等高版本

CentOS 7虽然已经出了不少年了&#xff0c;但依然会有不少人选择安装CentOS 6&#xff0c;CentOS 6有些依赖包和软件都比较老旧&#xff0c;现在天的主角gcc编译器&#xff0c;CentOS 6的gcc版本为4.4&#xff0c;CentOS 7为4.8。gcc 4.8最主要的一个特性就是全面支持C11&#…

JSP获取当前时间

JSP获取当前时间一、先看看如何取当前时间并显示的代码 ------------------------------------------------ <% java.text.SimpleDateFormat formatter new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); java.util.Date currentTime new java.util.Date…

bisect git 使用_让 Git Bisect 帮助你

最后一步&#xff0c;这次是坏的。$ git bisect bad458eab0eb8d808e16d98ec7039a7c53855dd9ed6 is the first bad commitcommit 458eab0eb8d808e16d98ec7039a7c53855dd9ed6Author: Rodrigo Flores Date: Tue Oct 21 22:31:05 2014 -0200added 1013:100644 100644 7bc3db7f48a…

linux shell中各种分号和括号,linux shell 各种分号,括号使用方法总结

各种括号的用法总结如下1.Shell中变量的原形&#xff1a;${var}大家常见的变量形式都是$var2.命令替换$(cmd)命令替换$(cmd)和符号cmd(注意这不是单引号&#xff0c;在美式键盘上&#xff0c;是ESC下面的那个键)有相同之处3.一串的命令执行()和{}()和{}都是对一串的命令进行执行…

restful get不传参数404_你知道什么是 Restful 风格吗?SpringMVC 带我们实现它!

Restful 风格的 API 是一种软件架构风格&#xff0c;设计风格而不是标准&#xff0c;只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁&#xff0c;更有层次&#xff0c;更易于实现缓存等机制。在 Restful 风格中&a…

ASP.NET MVC中同步与异步

1.MvcHandler总是调用BeginProcessRequest/EndProcessRequest方法以异步的方式来处理请求2.Controller分别实现了IController和IAsyncController两个接口&#xff0c;所以当激活的Controller对象在MvcHandler的BeginProcessRequest方法中是按照这样的方式执行的&#xff1a;Con…

linux搭建spark集群,详解Spark+Zookeeper搭建高可用Spark集群

Apache Spark是专为大规模数据处理而设计的快速通用的计算引擎&#xff1b;现在形成一个高速发展应用广泛的生态系统。Spark三种分布式部署方式比较目前Apache Spark支持三种分布式部署方式&#xff0c;分别是standalone、spark on mesos和 spark on YARN&#xff0c;详情参考。…

wifiwan口速率什么意思_无线路由器怎么设置wan口速率

wan口速率是设置无线路由器的wan口以什么速率方式工作&#xff0c;此设置不当会导致网速降低&#xff0c;下面是学习啦小编整理的无线路由器设置wan口速率的方法&#xff0c;供您参考。无线路由器设置wan口速率的方法在Wan口的设置中&#xff0c;当我们完成了基本的设置后&…

linux perl telnet安装,51CTO博客-专业IT技术博客创作平台-技术成就梦想

Telnet是一个古老而又不安全的协议&#xff0c;用来实现远程登录。这种服务可以和基于客户机/服务器进行通信&#xff0c;也就是说把你的电脑虚拟成一个键盘(伪终端)来和远程的服务进行通信&#xff0c;而服务器以为输入来自它本地的键盘&#xff0c;我们在本地所执行的命令会发…

hdu4473

这题的结果[f(1)f(2)...f(n)]其实就等价于x*y*z<n的解的个数&#xff0c;然后的方法几乎就是暴力枚举了。现场比赛的时候没想到这一点&#xff0c;太杯具了&#xff0c;浪费了两个小时的思考时间。其实我们的做法应该是可行的&#xff0c;因为f(n)具有积性性质&#xff0c;也…

https无法访问 宝塔_宝塔面板快速开启ssl(https)的方法

宝塔面板可以说在国内服务器配置方面是比较出名的&#xff0c;一些大的网站的服务器都是使用的宝塔面板&#xff0c;另外本博客作品的演示站点也是使用的宝塔面板。宝塔面板的操作与配置服务器环境对一些初入做站的将要跳坑的小白来说&#xff0c;就一件超越仙器的神器&#xf…

linux可以不用grub吗,既然不用Win了,那么GrubDOS也不用了。linux grub求指导

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼5、安装Grub到U盘上&#xff1a;[starlocalhost ~]$ sudo grub-install--root-directory/media/test/ /dev/sdbProbingdevices to guess BIOS drives. This may take a long time.Installationfinished. No error reported.This is…

raid 物理盘缓存状态_查看RAID状态

以下是组建服务器raid时查到的资料&#xff0c;做下笔记&#xff0c;没兴趣的朋友请无视。Linux下查看软、硬raid信息的方法。软件raid&#xff1a;只能通过Linux系统本身来查看cat /proc/mdstat可以看到raid级别&#xff0c;状态等信息。硬件raid&#xff1a; 最佳的办法是通过…