注:Record和Store之间存在交叉引用,不能直接序列化Record
//Record的构造函数
Ext.data.Record = function(data, id){
//这里没有用Ext.id()方法,Ext..id()方法用于给UI层提供唯一id
this.id = (id || id === 0) ? id : Ext.data.Record.id(this);
this.data = data || {};
};
//静态方法,返回Record子类的构造函数
Ext.data.Record.create = function(o){
var f = Ext.extend(Ext.data.Record, {});
var p = f.prototype;
//添加一个xt.util.MixedCollection类型的实例属性fields,
p.fields = new Ext.util.MixedCollection(false, function(field){
return field.name;
});
for(var i = 0, len = o.length; i < len; i++){
p.fields.add(new Ext.data.Field(o[i]));
}
f.getField = function(name){
return p.fields.get(name);
};
return f;
};
//手动添加数据
set : function(name, value){
//根据是否为基本数据类型,选择不同的编码方式
var encode = Ext.isPrimitive(value) ? String : Ext.encode;
//如果data中已经有了这个key-value对,直接返回
if(encode(this.data[name]) == encode(value)) {
return;
}
//脏数据标识
this.dirty = true;
//如果没有modified,创建一个挂靠在此Record实例上的js对象
if(!this.modified){
//用来存放修改过的数据
this.modified = {};
}
if(this.modified[name] === undefined){
this.modified[name] = this.data[name];
}
this.data[name] = value;
if(!this.editing){
this.afterEdit();
}
},
afterEdit afterReject afterCommit都是私有方法(只是声明为私有,用来被其他实例方法调用,主要和store联动。来更新store对record的维护),不希望被重写
//回滚
reject : function(silent){
var m = this.modified;
//从modifie对象里的修改前的数据拿出来,重新放回data里
for(var n in m){
if(typeof m[n] != "function"){
this.data[n] = m[n];
}
}
//脏数据false
this.dirty = false;
//删除modifie对象
delete this.modified;
this.editing = false;
if(silent !== true){
this.afterReject();
}
},