Ext输入成功后显示对勾

来源:互联网 发布:汕头公车实时软件 编辑:程序博客网 时间:2024/05/01 09:07
如何在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() || ''});                 var activeError = owner.getActiveError(),     hasError = !!activeError;     //切换对勾图标         errorEl[hasError ? 'removeCls' : 'addCls']('icon-yes');                 Ext.layout.component.field.Field.initTip();           }       });   } return strategy; }                                     });


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

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

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