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;我想可能要先提一下一些预备知识&…

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

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

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

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

哈夫曼字符串编码c语言实现,基于哈夫曼(haffuman)算法的文件压缩的实现(C语言)(原创)...

本文首先简要阐述哈夫曼算法的基本思想&#xff0c;然后介绍了使用哈夫曼算法进行文件压缩和解压缩的处理步骤&#xff0c;最后给出了C语言实现的文件压缩和解压缩的源代码。哈夫曼算法的主要思想是&#xff1a;①首先遍历要处理的字符串&#xff0c;得到每个字符的出现的次数&…

代码之谜(三)- 运算符

从最简单的运算符加号()说起&#xff0c;加号()是个二元运算符——也就是说&#xff0c;加号只把两个数联接起来&#xff0c;从来不把第三个或者更多的联接起来。 因此&#xff0c;“1加2加3” 在计算机中被表述为&#xff1a; (1 2) 3 // a 或者 1 (2 3) // b 虽…

非培训的前端转行之路(根据个人真实经历)

我是歌谣 放弃很很难 但是坚持一定很酷 本文乃本人真实经历书写 希望对你的工作和学习有所帮助 感谢你得阅读 前言 我是歌谣&#xff0c;当然真名不是叫歌谣。 歌谣的原因 1. 歌谣可以传承很久 影响比较大 2. 歌谣可以让人心情愉悦 让人积极向上 3. 名字里面有个谐音 哈哈 …

一文带你理解vue创建一个后台管理系统流程(Vue+Element)

我是歌谣 放弃很容易 但是坚持一定很酷 1前言 本文根据自己工作经历编写&#xff0c;若有不合理之处&#xff0c;欢迎吐槽 2定义 后台管理系统什么 对一个页面进行增删改查 是不是有点像&#xff0c;不重复定义 3第一次接触后台管理系统 第一次接触后台管理系统是某b站的一…

“数万行代码“教你用html和css编写一个精美的网页

我是歌谣 放弃很容易 但是坚持一定很酷 1前言 作为一名前端开发工程师 开发一个完美的网页也是我们的必修课之一 逻辑写起来有时候不是那么的难 据说页面样式才是最难的一课 本文内容纯属自己个人观点 欢迎一起交流吐槽 2网页基础版&#xff08;divcss&#xff09; 我第一次接触…

一文带你理解如何解决工作中的需求

我是歌谣 放弃很容易 但是坚持一定很酷 1前言 在我们的开发过程中 会遇到一些开发的需求 怎么实现 怎么写 怎么做才最合理 2需求处理 拿到一个需求就和做数学题一样 我们要理清所有的关系 由于本文知识对需求进行阐述 所以就以vue为例子 2.1 需求1处理页面样式某页面跳转之后如…