做一个extjs的扩展

原文链接:http://www.gbtags.com/gb/share/5600.htm

最近真是忙啊忙,而且在用我最讨厌的extjs写东西···

然而实在是忙得没精力做别的了,所以发一篇extjs相关的内容。

总体来说extjs是一个不错的框架,用来做XX系统什么的非常的般配,只不过我讨厌他的编程方式,虽然很灵活,很MVC,但是这一切都要建立在你妥协在他的规则之下。

他灵活是因为每一个空间的文档,属性加事件加方法足有几百多个,总会有一个你会用到······

开始我们的扩展之前,先说一个小tip,当你用的是extjs5,而且用的是chrome浏览器的时候,你会发现你的表单空间点击之后会串行,像这样:

然后因为他的input包在一个display是table-cell的div里,当然这个div的父元素的display是table。这其实很正常,因为我们需要做组合的空间的时候能保证横向的延展,boot也是这么做的。但是我们会发现chrome审查元素的时候会发现奇怪的东西,比如···

他的div有一个默认的 vertical-align-- baseline···,天晓得为什么属性的默认值也会出事,我也没进一步的去调试,因为解决办法是有的,

我们可以暴力一点,加个:

  1. div{vertical-align:top}

即可,感觉太暴力的小朋友可以只改那个样式的vertical-align。改好的样子就很正常了:

然后我们继续说扩展一个插件这回事儿,我要做的事情是这样的。

需要一个上面第一张图里面的那种上传图片的空间,上传上去后能够同步显示,当然这需要先上传到服务器,然后返回地址,可以删除,可以新增,然而这些都是次要的。

邪恶主管说我传给你用来绑定的字段值是一个有id有url的json串,但是你返回给我的需要时一个都好分割的id数组·······

我的表单已经抽成公共的了,我不希望为了它在提交前作一些额外的转换,所以重点是,我需要他绑定值得时候像正常的控件那样,而我获取值得时候,也要不经过额外的处理···

算了不首先了···extjs这么恶心的东西估计用的人也不多,直接先把v层的代码贴出来吧···

  1. /**
  2. *
  3. * TODO 用于多组图片上传
  4. * 组件正常接收 form组件 value值 类型为json结构的字符串
  5. * 输出value值为 以”,“分割的id字符串,表单提交时不必特殊考虑.
  6. *
  7. */
  8. Ext.define(‘Backend.plugin.tmImgField.TmImgField‘, {
  9. extend: ‘Ext.Container‘,
  10. layout: {
  11. type: ‘hbox‘,
  12. bodyPadding: 10
  13. },
  14. requires: [
  15. ‘Ext.Img‘,
  16. "Backend.plugin.tmImgField.TmImageUploadController"
  17. ],
  18. controller: ‘imageUpload‘,
  19. xtype: ‘tmImgfield‘,
  20. bodyPadding: 10,
  21. margin:‘0 3 5 0‘,
  22. frame: true,
  23. align: ‘middle‘,
  24. autoDestroy: true,
  25. bodyPadding: 15,
  26. width: ‘100%‘,
  27. baseImg: ‘/static/css/images/addImg.jpg‘,
  28. buttonText:‘上传‘,
  29. initComponent: function () {
  30. var self = this,
  31. baseImg = self.baseImg;
  32. var label = self.fieldLabel,
  33. name = self.name,
  34. value = self.value || ‘‘,
  35. allowBlank = self.allowBlank;
  36. //label
  37. var items = [];
  38. items.push({
  39. html:‘<span style="color:#666;">‘+label+‘:</span>‘,
  40. width:90,
  41. style:‘text-align:right;‘,
  42. });
  43. //form hidden field
  44. var hiddenField = Ext.create("Ext.form.field.Text", {
  45. name: name,
  46. value: value,
  47. allowBlank: allowBlank,
  48. hidden: true,
  49. listeners: {
  50. setImgValues:‘changeValue‘,
  51. change: ‘checkValue‘,
  52. validitychange: ‘validitychange‘
  53. },
  54. reference: ‘imgInput‘,
  55. });
  56. items.push(hiddenField);
  57. //添加按钮
  58. var imgBtn = Ext.create(‘Ext.form.FieldSet‘,{
  59. layout:‘vbox‘,
  60. cls:‘imgFieldSet‘,
  61. reference:‘imgFieldBtn‘,
  62. style:{border:0},
  63. padding:4,
  64. width:108,
  65. height:137,
  66. items: [
  67. {
  68. xtype:‘image‘,
  69. autoEl: ‘div‘,
  70. imgCls: ‘product_image‘,
  71. width:100,
  72. height:100,
  73. src:baseImg
  74. },{
  75. xtype:‘button‘,
  76. text:self.buttonText,
  77. width:80,
  78. margin:‘5 0 0 10‘,
  79. handler: ‘addImg‘
  80. }
  81. ]
  82. });
  83. //右侧展示区域
  84. var field = Ext.create(‘Ext.form.FieldSet‘,{
  85. padding:‘4‘,
  86. margin:‘0 5‘,
  87. flex:1,
  88. reference: ‘imgArea‘
  89. });
  90. field.add(imgBtn);
  91. items.push(field);
  92. self.items = items;
  93. self.callParent();
  94. },
  95. afterRender: function () {
  96. var self = this;
  97. self.callParent(arguments);
  98. }
  99. });

现在我们开始首先,

首先你需要一个form控件去接受值,我们选择用text而不是hidden,因为我们需要allowBlank方法控制是否必填,而hidden没有这个属性(详情请看hidden那n多个属性),然后把这个text隐藏起来,因为我们可见的东西是那些img。

然后我们要先收到传过来的值,这里面有两个办法,最好的办法是override这个text的setValue方法,然而我们用的是另外一种,别问为什么,我脑子短路当时。

我们给这个text三个监听,我们先讲第一个,change。

顾名思义,就是值发生变化的事后启动。当然也包括setValue的时候。

  1. //校验value
  2. checkValue: function (item, value) {
  3. if(!value){ item.fireEvent(‘setImgValues‘,{},‘delAll‘); return;}
  4. try{
  5. var _value = Ext.JSON.decode(value);
  6. if(typeof(_value) === ‘object‘)
  7. item.fireEvent(‘setImgValues‘,_value,‘add‘);
  8. }catch(e){
  9. }
  10. },

就是查看value,然后判断,如果是object那就手动启动另外一个监听,如果是正常值,就什么也不做。

然后我们就会跳到另外一个监听里,

  1. //值修改事件
  2. changeValue: function (value,flag) {
  3. if(!value) return;
  4. var maxLength = this.getView().maxLength || 0,
  5. imgFieldBtn = this.lookupReference(‘imgFieldBtn‘);
  6. var items = this.imgValues || [];
  7. if(flag === ‘add‘){
  8. items = Ext.Array.union(items, value);
  9. }else if(flag===‘del‘){
  10. delete items[value]
  11. }else if(flag===‘delAll‘){
  12. items = [];
  13. }
  14. var imgArea = this.lookupReference(‘imgArea‘),
  15. oldItems = imgArea.items.items;
  16. //先删除
  17. for(var i = oldItems.length- 1; i > -1; i --){
  18. if(oldItems[i].imgType && oldItems[i].imgType==‘imgBox‘){
  19. oldItems[i].destroy();
  20. }
  21. }
  22. //input value
  23. var inputValue = [];
  24. //重新渲染
  25. for(var key in items ){
  26. var item = items[key];
  27. var imgBox = this.buildImg(key,item);
  28. imgArea.insert(imgArea.items.getCount()-1,imgBox);
  29. inputValue.push(item.id);
  30. }
  31. //赋值
  32. this.imgValues = items;
  33. this.lookupReference(‘imgInput‘).setValue(inputValue.join(‘,‘));
  34. if(maxLength && maxLength <= inputValue.length){
  35. imgFieldBtn.hide();
  36. }else{
  37. imgFieldBtn.show();
  38. }
  39. },

他把显示的图片删除再重构,我们把得到的json放在this里即可,然后显示的value值我们付成逗号分隔的字符串。每次的删除,增加操作我们都手动的出发这个方法即可。

我们还人性化的给加了maxLength,如果到了最大值,就把增加按钮隐藏。

这样input值得绑定和获取就能按照正常的extjs的表单控件走了。

最后一个问题,校验是否必填。像这样

这是extjs自带的功能,但是我们的input控件已经隐藏了,那个边是我们自己画的·······怎么办。

没关系,我们在他的文档里找啊找找啊找,就找到了第三个监听,validitychange。

这个属性监听validity状态的改变···也是醉了··· 这也给接口········

  1. // validate 改变
  2. validitychange: function(field,isValid,eOpts){
  3. var self = this,
  4. fieldSet = this.lookupReference(‘imgArea‘);
  5. if(isValid){
  6. fieldSet.removeCls(‘field-error‘);
  7. }else{
  8. fieldSet.addCls(‘field-error‘);
  9. }
  10. },

我们监听它的值,然后给我们的边框加一个class,这个class自然是改border-color的啦。

这样,一切就ok,他和普通的控件一样用,因为他的setValue和getValue传递的都是符合我们要求的值。而且可以做校验,可以设定上传数量。

原文链接:http://www.gbtags.com/gb/share/5600.htm

时间: 2024-10-27 01:36:51

做一个extjs的扩展的相关文章

用PHP扩展做一个HelloWorld!

用PHP扩展做一个HelloWorld! PHP 尽管提供了大量有用的函数,但是在特殊情况下还可能需要进行扩展编程,比如大量的 PECL(PHP Extension Community Library)就是以扩展的形式提供的(动态链接库dll文件),它们比 PEAR 的运行效率要高很多.     PHP 扩展是用 C 或 C++ 编写的,需要编译成动态连接库 dll 文件后在 PHP 环境下注册后才能使用.     编写 PHP 扩展的软件要求:       VC++6.0 或 VC++.NET

扩展一个boot的插件—tooltip&amp;做一个基于boot的表达验证

在线演示 本地下载 (代码太多请查看原文) 加班,加班加班,我爱加班··· 我已经疯了,哦也. 这次发一个刚接触boot的时候用boot做的表单验证,我们扩展一下tooltip的插件,让他可以换颜色. 其实挺简单的,主要是考究代码阅读的能力. boot的代码写的很简单,能省略“;”的地方就省略掉了,而且他的闭包也很有意思 +function($){ }(jQuery); 这种写法等同于 (function($){ })(jQuery); 少些一个符号,比较节俭. 他的对外接口写的就比较正常了:

.Net MVC&amp;&amp;datatables.js&amp;&amp;bootstrap做一个界面的CRUD有多简单

我们在项目开发中,做得最多的可能就是CRUD,那么我们如何在ASP.NET MVC中来做CRUD呢?如果说只是单纯实现功能,那自然是再简单不过了,可是我们要考虑如何来做得比较好维护比较好扩展,如何做得比较漂亮.做开发要有工匠精神,不要只求完成开发任务,那样的话,永远停留在只是简单的写业务逻辑代码水平,我们要做有追求的程序员.本来这么简单的东西,我真是懒得写,但是看到即便是一些工作了好些年的人,做东西也是只管实现功能,啥都不管,还有些界面css样式要么就硬编要么就毫无规则的在页面中进行穿插,遇到要

做一个会PS切图的前端开发

系列链接 做一个会使用PS的前端开发 做一个会PS切图的前端开发 切图方法分类 PhotoShop从CS版本演变到现在的CC版本,切图功能发生了比较大的变化,我们可以把PhotoShop CS版本时的切图功能称为传统切图,而从PhotoShop CC版本开始PS提出了精准切图.所谓传统切图就是切图人员基本上都是自己分割图层切图,传统切图又分为全手工切图和参考线切图:现在CC版本提出的精准切图,切图人员可以依赖计算机把图层对象精确的切割出来,这样切割出来的图层肯定比传统切图切出来的精准度高.另一方

我们该怎么学习?做一个学者还是习者?

今天我们来谈的话题是"学习".本文的部分构成素材来自网友:"lesini" (乐死你?还是累死你?). 我们从出身到将来多年后的"走人",每个环节.时间段都穿插了一个与社会.环境.人有极高互动性的要素,那就是"学习". 据翻查资料,原来"学习"这个词是孔子发明的,最早时期"学"和"习"是分开的两个独立字.孔子在<论语.学而>提出了"学而时习之,不

NetAnalyzer笔记 之 三. 用C++做一个抓包程序

[创建时间:2015-08-27 22:15:17] NetAnalyzer下载地址 经过前两篇的瞎扯,你是不是已经厌倦了呢,那么这篇让我们来点有意思的吧,什么,用C#.不,这篇我们先来C++的 Winpcap开发环境配置 完成了对Winpcap的介绍,什么,你没看到Winpcap的介绍,左转,百度(其实,真的是不想复制).我们就需要做一点有用的事情,比如写一个简单的数据采集工具.当然在此之前,我们需要配置Winpcap的开发环境. (1) 运行环境设置 Win32 平台下Winpcap应用程序

如何开始一个模块化可扩展的Web App(转)

原文链接:http://avnpc.com/pages/start-a-modular-extensible-webapp 日志未经声明,均为AlloVince原创.版权采用『 知识共享署名-非商业性使用 2.5 许可协议』进行许可. 虽然从没有认为自己是一个前端开发者,但不知不觉中也积累下了一些前端开发的经验.正巧之前碰到一道面试题,于是就顺便梳理了一下自己关于Web App的一些思路并整理为本文. 对于很多简单的网站或Web应用来说,引入jQuery以及一些插件,在当前页面内写入简单逻辑已经

【Bugly干货分享】一起用 HTML5 Canvas 做一个简单又骚气的粒子引擎

Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 前言 好吧,说是“粒子引擎”还是大言不惭而标题党了,离真正的粒子引擎还有点远.废话少说,先看[demo],扫描后点击屏幕有惊喜哦… 本文将教会你做一个简单的canvas粒子制造器(下称引擎). 世界观 这个简单的引擎里需要有三种元素:世界(World).发射器(Launcher).粒子(Grain).总得来说就是:发射器存在于世界之中,

如何做一个出色的程序员(转)

首先要告诉大家的是要爱这行! 从事任何行业都一样,只有真正的爱上了这份工作,才会投入热情,才会在顺境中自我警醒,在逆境中寻找突破.这个行业的竞争很激烈,你停下来走,别人就立刻会跑步超过你,没有对这一行业的一种热情,就很难在困境中保持一种执着的态度坚持到底. 踏踏实实“扎马步” 今天无意中看了“校长”的“程序员&司机”,其中谈到了关于程序员速成的问题.其实速成班毕业的 “系统杀手”早已在遍布大江南北,只是在互联网时代,互联网的应用型软件生命周期越来越短,业务驱动主导的情况下,这种速成方式看起来反而