zoukankan      html  css  js  c++  java
  • form.loadRecord(record)后isDirty总是true的解决办法

    做项目时遇到一个问题,我需要判断form表单中数据是否被更改过,

    先是由于后台返回给我的是字符串数组,所以直接用了获取数组的形式给组件的value赋值,也就是setValues(),此时当没有修改form时isDirty()为false,修改过后是true,没问题;

    但是后来发现返回数组很不方便,就又返回了store给我,我获取了store中的record后用form.loadRecord(record)方式给表单赋值后,即使我没有修改表单,isDirty()也总是为true了,个人理解是组件加载时的空数据被form认为是初始数据,当给form加载数据时,此时已经相当于是修改数据了,所以isDirty()总是true。以下为网上其他人的解释,自己确实要反思为什么不去仔细查看API!

     

    以下转载自:http://doc.okbase.net/wangs7345/archive/111076.html

     

    做项目遇到,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;
        }
  • 相关阅读:
    [译]Mongoose指南
    shell去掉后缀方法
    memcache和memcached区别
    ssh隧道远程连接mysql
    nginx实现某个页面http访问,其余全部跳转到https
    es快照和备份
    elasticsearch 单节点实现
    logstash5安装并实现mariadb数据写入到elasticsearch
    linux 内存分析
    zabbix api创建screen vsize限制解决
  • 原文地址:https://www.cnblogs.com/linruiyi2015/p/9155969.html
Copyright © 2011-2022 走看看