代码改变世界

Ext.data.Record前台的"数据库行数据"

2012-02-08 20:34    阅读(272)  评论(0)    收藏  举报

注:RecordStore之间存在交叉引用,不能直接序列化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();
        }
	},