yui2 datatable转换至yui3

网上有很多简便的方法,例如说 直接include进来就用啊。 我还是坚持在compat的基础上融合进来;不过说到完美程度,是不及完整理解yui3的类库后再重写。但是第一目标:可用,第二目标:自己看着舒服

 

首先是Element的依赖,直接吸收。还没有找yui3里面有没有对应的类。如果没有就以yui2的element了。

datasource,也是直接吸收。因为现在还不清楚yui3 的datasource(尚处于beta) 与yui2的差异。(看表现形式是有差异,但核心本质应该不变)

 

转换最常见的问题还是事务的处理方式;yui2中的事务响应代码,用this 就可以引用到事件的发布者,但yui3不行,解决的方法是在on的时候,相应代码用Y.bind来捆绑this。达到传递this的目的。还有一种思路是在on方法后面跟参数,但是需要修改事件相应代码的接口,抑或是用arguments 来获取,增加了一些负担。不过后者应该在执行期比较高效。(只是传值,并不产生新的实例)

 

 

关于id的部分,有一句超级陷阱:

 

elTh是一个通过appendChild 返回的对象

 

elTh = elTheadTr.appendChild(document.createElement("th"));

 

 

在yui2里面,elTh等于是dom对象了。但是在yui3里面发生了变化。elTh不是一个dom对象,是一个yui3血统的object。(貌似就是Node?),里面用_node 引用了dom对象, 所以在yui3里面,一定要思路清晰的是,每个从yui3标准方法返回的对象,都已经是包装过了(yui2也这么干了,但是在方法 使用上没有那么清晰的界限 【指dom方法属性和原型方法属性】)

 

所以不能直接赋值id来 改变对方的dom名字了。这就像把别人家的门牌号改了,就期望住在里面的人的名字也修改了一样,是无效的行为。

所以,修改方法很简单:

 

elTh.set('id',this.getId() + "-th-" + oColumn.getSanitizedKey());

 

 

经过如上的处理,终于来到了loading画面

this.showTableMessage(this.get("MSG_LOADING"), DT.CLASS_LOADING);

 

接下去,还是跟着代码走

 

8.6 补充说明

 

经过研究,compat.js 已经对Dom对象获取方式进行了转换,即使用Y.util.Dom.get方法,拿到的对象是一个w3c dom node。并非是一个YUI3 node,因此可以兼容yui2 对node的操作方式(如 obj.innerHTML  / obj.style.display 之类),也因此无需可以做转换(如:obj.set('innerHTML','')  / obj.setStyle('display','') ;  ) 也减少了转换代码量。【针对datatable.js 而言】

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值