Javascript 如何避免在Extjs 4中对隐藏字段进行验证

Javascript 如何避免在Extjs 4中对隐藏字段进行验证,javascript,extjs,extjs4,extjs4.1,Javascript,Extjs,Extjs4,Extjs4.1,当容器具有hidden:true而不是实际字段时,如何不验证隐藏字段 为了解决这个问题,我做了以下的重写,它起了作用,尽我所能不影响正常的验证流程,所以代码看起来不太好 /* traverse up and look for a hidden Parent/Ancestor */ Ext.override(Ext.form.field.Base, { isParentHidden: function () { return this.up('[hidden=true]')

当容器具有
hidden:true
而不是实际字段时,如何不验证隐藏字段

为了解决这个问题,我做了以下的重写,它起了作用,尽我所能不影响正常的验证流程,所以代码看起来不太好

/* traverse up and look for a hidden Parent/Ancestor */
Ext.override(Ext.form.field.Base, {
    isParentHidden: function () {
        return this.up('[hidden=true]');
    }
});

/* override isValid basic method to consider skipValidateWhenHidden property, 
when skipValidateWhenHidden is set to true code should check if the elementor it's Parent/Ancestors is hidden */
Ext.override(Ext.form.field.Base, {
    isValid: function () {      
        var me = this,
            disabled = me.disabled,
            isHidden = me.isHidden(),
            skipValidateWhenHidden = !!me.skipValidateWhenHidden,
            validate = me.forceValidation || !disabled,
            isValid = validate ? me.validateValue(me.processRawValue(me.getRawValue())) : disabled;

        if (isValid || !skipValidateWhenHidden) {
        return isValid;
        }

        if (skipValidateWhenHidden) {
            isHidden = isHidden ? true : me.isParentHidden();
            if (isHidden) {
                return skipValidateWhenHidden;
            }
        }

        return isValid;
    }
});
最终,我将能够执行以下操作,即在字段中将属性设置为true,这样,如果它对用户不可见,它将通过验证

 {
      itemId: 'City',
      cls: 'AddressCity',
      xtype: 'textfield',
      emptyText: emptyCityText,
      skipValidateWhenHidden: true,
 },

隐藏父项时,禁用字段可能更容易。如上所述,禁用的字段将自动被视为有效字段


然后,您可以在每个视图的基础上处理此问题,并在父级显示/隐藏事件上实现侦听器,以启用/禁用其中的表单字段。

我也遇到过同样的情况,并最终执行了以下操作:

if (!me.isFormValid(form)) {
    ...
}

isFormValid: function (form) {
    var isValid = true,
        fields = form.getForm().getFields();

    fields.each(function (field) {
        if (!field.isHidden || (field.isHidden && !field.isHidden())) {
            isValid = isValid && field.isValid();
        }
    });

    return isValid;
},

我已经考虑过,我知道禁用按钮会使它们跳过验证,但就我而言,动态显示和隐藏父项的父项,并且在执行显示和隐藏时管理字段状态并不容易。为了清晰起见,我放了一个示例来说明这一想法。在我在
fieldcontainer
上实现的简单侦听器中,我查询容器下的所有
字段
组件。因此,从理论上讲,无论父项是如何显示或隐藏的,字段都会自动为您禁用/启用。我只是想把一些东西放在一起看看是否对你有帮助。谢谢你,这看起来是很多但不是所有情况下的一个有效解决方案,再一次,如果多了一个嵌套级别,它将不起作用,例如,在我的情况下,我有一个address类,在我有CityStateZip类的下面有一个级别。我知道它不应该是嵌套的,但是考虑到逻辑和这些类附带的代码量,我认为这是有意义的。无论如何,谢谢你的建议。我的一个同事在mixins做了同样的事情。