刚接触Ext的新手们,你们是不是经常遇到这种情况?明明在表单里设置了必填项,用户却还能提交空数据?或者反过来,想做个可选字段时系统死活不让提交?今天咱们就来扒一扒这个让无数人抓狂的allowBlank属性。
先给完全没概念的同学打个比方。这个allowBlank就像你家小区门卫——默认情况下它是个特别宽松的老大爷(默认值是true),不管带不带门禁卡都能进出。但你要是想让门卫严格点,就得用正确的方式给他下指令。
第一道门槛:认识基础配置 在Ext的表单组件里,不管是TextField、ComboBox还是DateField,只要继承自Ext.form.field.Base的控件,都自带这个属性。假设你要做个用户名的必填项,正确的打开方式是: { xtype: ‘textfield’, fieldLabel: ‘用户名’, name: ‘username’, allowBlank: false // 这里改成false才管用 } 注意!这里有个新手必踩的坑:很多人以为设置true才是必填,结果发现完全反着来。记住这个逻辑:allowBlank=true表示允许留空,false才是必须填写。
动态调整的骚操作 实际开发中经常遇到这种情况:某个字段在特定条件下才需要必填。比如当用户选择”企业用户”时,公司名称才变成必填项。这时候就需要动态修改allowBlank的值。
在监听事件里这么干: // 当下拉框选中值变化时 comboBox.on(‘change’, function(field, newValue) { var companyField = Ext.getCmp(‘companyName’); if(newValue === ‘enterprise’) { companyField.allowBlank = false; companyField.validate(); // 记得手动触发验证 } else { companyField.allowBlank = true; companyField.clearInvalid(); // 清除之前的错误提示 } }); 这里有个关键点:直接修改属性值后,必须手动调用validate()或clearInvalid(),否则界面上的红框提示不会自动更新。
验证规则打架怎么办? 当allowBlank和其他验证规则(比如vtype或regex)同时存在时,验证顺序很重要。Ext的机制是:先检查allowBlank,如果没通过就直接报错,不会继续执行其他验证。
举个活生生的例子: { xtype: ‘textfield’, vtype: ’email’, allowBlank: true } 这种情况下,用户就算输入”123″这种非邮箱格式,只要不是空值,系统都不会报错。想要同时满足非空和格式验证,必须把allowBlank设为false。
那些让人抓狂的隐藏规则 有时候明明设置正确,但验证就是不起作用。这时候要检查这几点: 1. 表单的submit动作是否调用了isValid()方法 2. 字段所在的容器有没有设置layout:’form’ 3. 是否在afterRender之后才修改allowBlank 4. 使用Ext JS 4和Ext JS 6时,某些版本存在验证延迟的问题
有个特别隐蔽的坑:当字段被包含在fieldset里时,如果fieldset的collapsed=true(折叠状态),该字段的验证会被自动跳过。这时候需要在提交前手动展开面板并执行验证。
实战中的保命技巧 在大型表单里调试验证规则时,推荐这几个调试方法: – 在浏览器控制台输入 Ext.form.field.Base.prototype.showValidationMsg = true 强制显示所有提示 – 给表单添加监听器监控beforeaction事件 – 使用getErrors()方法打印当前字段的所有错误信息 – 在开发阶段暂时关闭异步验证(asyncValidator配置项)
最后说点掏心窝子的话:allowBlank看着简单,但实际用起来处处是细节。新手最容易犯的错误就是把它当成唯一验证手段,其实它应该和其他验证规则配合使用。遇到验证失效时,先别急着怀疑人生,按我说的检查清单挨个排查,保证能解决九成以上的问题。记住,好的表单验证就像贴心的管家——既不让用户乱填数据,也不会用烦人的提示把人逼疯。
本站文章由SEO技术博客撰稿人原创,作者:阿君创作,如若转载请注明原文及出处:https://www.ainiseo.com/hosting/17699.html