原文出处: http://wangs7345.iteye.com/blog/2153391
做项目遇到,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; }