如何在Ext校验成功后显示对勾——for ExtJS4.1

来源:互联网 发布:jquery 1.12.4.min.js 编辑:程序博客网 时间:2024/05/21 22:22
如何在Ext校验成功后显示对勾鈥斺攆or <wbr>ExtJS4.1

 
  使用ExtJS有段时间了,感觉Ext在样式上和用户体验上还有很大的提升空间。比如,在表单校验成功后显示对勾是目前比较流行的一种方式。经过我两天时间的源代码研究,终于找到了一个比较简单的实现方法。如下:

我在这里做了两件事:
1.使用'side'方式显示错误信息时,表单会缩进,我把这个效果去掉了
2.实现对勾和叹号图标的切换

注意:
我自定义了对勾的css样式,这里叫做'icon-yes'

//表单校验通过时显示对勾//复写了Ext.layout.component.field.Field,该类用于处理表单的label和错误信息//showValidIcon :BooleanExt.layout.component.field.Field.override({      getErrorStrategy: function() {       var me = this,           owner = me.owner,           strategies = me.errorStrategies,           msgTarget = owner.msgTarget;       var strategy=    !owner.preventMark &&Ext.isString(msgTarget) ? (strategies[msgTarget] ||strategies.elementId) :  strategies.none;//给表单自定义showValidIcon:Boolean配置项//如果showValidIcon=true,并且使用'side'方式,则使用对勾(否则是默认,不对原来的代码产生影响)       if(msgTarget== 'side' &&owner.showValidIcon){          //初始化时不显示icon         if(owner.isIconInit){            owner.errorEl.setDisplayed(false);            owner.isIconInit = true;          }          //一旦校验,显示icon         owner.on('validitychange', function(me, valid){            me.errorEl.setDisplayed(true);             });                  Ext.apply(strategy,{             //取消缩进效果            adjustHorizInsets : Ext.emptyFn,             layoutHoriz: function(ownerContext, owner, size) {               ownerContext.errorContext.setProp('x', size.width);             },             layoutVert:function(ownerContext, owner){                              ownerContext.errorContext.setProp('y',ownerContext.insets.top);             },             prepare :function(ownerContext, owner) {                var errorEl= owner.errorEl;               errorEl.addCls(Ext.baseCSSPrefix + 'form-invalid-icon');               errorEl.set({'data-errorqtip': owner.getActiveError() ||''});                               varactiveError = owner.getActiveError(),                  hasError =!!activeError;                 //切换对勾图标               errorEl[hasError ? 'removeCls' : 'addCls']('icon-yes');                              Ext.layout.component.field.Field.initTip();                     }              });       }       return strategy;   }                                                     });


   使用时只需要给表单项多配置一个showValidIcon: true即可。

   自己对这段代码不太满意的地方是使用了‘validitychange’事件,如果用户定义了自己的validitychange事件,执行时可能会有顺序问题。但我也是迫于无奈。ExtJS4的布局封装的太复杂了,弄不清是怎么做的。目前使用起来暂时没有问题。

   如果大家有更好的实现方法,期待分享!!!