extjs再用到表单form的时候,经常需要判断内容是不是被修改过。这里有许多陷阱,这里根据自己的经验给大家分享下:
一、对基本的form或者xtype为formpanel的组件,经常会出现 每次调用form的isDirty()方法返回的都是true,这种情况下其实可以去看下API,
- /**
- * @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,
trackResetOnLoad是在form表单load数据的时候是否记录字段原始值的开关。
在setVlaues中会根据这个开关进行判断,如果为true就记录这个数据。
所以你可以在初始化 form的时候给他的trackResetOnLoad属性置为true.
1、以上适用于类似于新增打开的form判断。如果是类似点击修改的操作,必须修改
form的originalValue,在loadRecord数据后,再次给原始值复制:
- form.getForm().items.each(function(f){
- f.originalValue=String(f.getValue());
- });
2、如果form不是通过setValues或loadRecord来赋值,而是单个组件分别赋值trackResetOnLoad的值可不用配置。
二、xtype为form的组件,一开始我也尝试着给他设置TrackResetOnLoad属性,但是一直失败。后来看了源码知道,原来xtype为form的组件其实
本质是一个panel,只是给了它一些form的基本属性而已,知道这个以后,果断利用他的getForm()方法拿取form,然后在用
form.setConfig("trackResetOnLoad",true);然后在form的setValues()以后重新reset()下,让他的oraginalVal变成最新的值,总结的代码
var form = Ext.getCmp("form").getForm();
form.setConfig("trackResetOnLoad",true);
form.setValues(obj);
form.reset.
接下去用isDirty()取判断时候回以setValues()以后改变的值作为有么有修改的标准。