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;
    }

转载于:https://www.cnblogs.com/linruiyi2015/p/9155969.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <windows.h> #define M 50 struct date { int year; int month; int day; }; struct library { int book_num; char book_name[40]; char author_name[10]; float book_price; char publisher[40]; struct date publish_time; char book_state[2]; char reader_name[10]; int reader_num; }; int input(struct library book[]); void list(struct library book[], int n); void search_name(struct library book[], int n); __________________填空____________________________; void sort_name(struct library book[], int n); int borrow_book(struct library book[], int n); ___________________填空___________________________; void saverecord(struct library book[], int n); int loadrecord(struct library book[]); int menu(); void main() { struct library b[M]; int length; while(1) { switch(menu()) { case 1:length = input(b); if(length == -1) break; else saverecord(b, length); break; case 2:length = loadrecord(b); list(b, length); break; case 3:length = loadrecord(b); search_name(b, length); break; //case 4:length = loadrecord(b); //___________填空__________; //saverecord(b, length); //break; //case 5:length=loadrecord(b); //length=Delete_num(b, length); //saverecord(b, length); //break; //case 6:length = loadrecord(b); //borrow_book(b,length); //saverecord(b,length); //break; //case 7:length = loadrecord(b); //________填空______________; //saverecord(b,length); //break; case 8:exit(0); } } } int menu() { int c; system("mode con:cols=400 lines=30000"); system("color 0b"); printf("\t\t\t\t\t-----------------------------------------------\n"); printf("\t\t\t\t\t+ 图书信息管理系统 +\n"); printf("\t\t\t\t\t-----------------------------------------------\n"); printf("\t\t\t\t\t\t\t ****************\n"); printf("\t\t\t\t\t\t\t 1.输入图书信息\n"); printf("\t\t\t\t\t\t\t 2.显示图书信息\n"); printf("\t\t\t\t\t\t\t 3.按图书名标查询图书信息\n"); printf("\t\t\t\t\t\t\t 4.按图书名称从小到大排序图书信息\n"); printf("\t\t\t\t\t\t\t 5.按图书编号删除图书信息\n"); printf("\t\t\t\t\t\t\t 6.借书\n"); printf("\t\t\t\t\t\t\t 7.还书\n"); printf("\t\t\t\t\t\t\t 0.退出\n"); printf("\t\t\t\t\t\t\t ****************\n"); do { printf("\n Enter your choice(0-7):"); if (scanf("%d" , &c) != 1) { while (getchar() != '\n') continue; continue; } }while (c<0 || c>7); return c; }
最新发布
07-12

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值