ExtJs如何判断form表单是否被修改过

?

做项目遇到,form表单提交时要判断form是否被修改过,经查API得知:

BasicForm中有事件可监听到。

?

    /**
     * 表单加载后,一旦有任何一个表单元素被修了,就返回真。
     * Returns true if any fields in this form have changed since their original load.
     * @return Boolean
     */
    isDirty : function(){
        var dirty = false;
        this.items.each(function(f){
           if(f.isDirty()){
               dirty = true;
               return false;
           }
        });
        return dirty;
    }

?

?

但是实际测试时无论是否改变form内的值,form.getForm().isDirty()返回全是true。

再查API发现,原来在BasicForm还有个配置起关键作用:

?

    /**
     * @cfg {Boolean} trackResetOnLoad 
     * 如果为true,则表单对象的form.reset()方法重置到最后一次加载的数据或setValues()数据,以相对于一开始创建表单那时的数据。 
     * If set to true, form.reset() resets to the last loaded or setValues() data instead of when the form was first created.
     */
    trackResetOnLoad : false,

?

?

再次验证form.getForm().isDirty(),达到预期。

?

trackResetOnLoad是在form表单load数据的时候是否记录字段原始值的开关。?

?

在setVlaues中会根据这个开关进行判断,如果为true就记录这个数据。?

?

    setValues : function(values){
        if(Ext.isArray(values)){ // array of objects
            for(var i = 0, len = values.length; i < len; i++){
                var v = values[i];
                var f = this.findField(v.id);
                if(f){
                    f.setValue(v.value);
                    if(this.trackResetOnLoad){
                        f.originalValue = f.getValue();
                    }
                }
            }
        }else{ // object hash
            var field, id;
            for(id in values){
                if(typeof values[id] != ‘function‘ && (field = this.findField(id))){
                    field.setValue(values[id]);
                    if(this.trackResetOnLoad){
                        field.originalValue = field.getValue();
                    }
                }
            }
        }
        return this;
    }

?

?PS:

1、以上适用于类似于新增打开的form判断。如果是类似点击修改的操作,必须修改

? ? ? form的originalValue,在loadRecord数据后,再次给原始值复制:

?

       form.getForm().items.each(function(f){
            f.originalValue=String(f.getValue()); 
        });
? ? ? ?

?2、如果form不是通过setValues或loadRecord来赋值,而是单个组件分别赋值trackResetOnLoad的值可不用配置。

?

永久链接:?http://wangs7345.iteye.com/blog/2153391

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。