现在的位置: 首页 > 综合 > 正文

11、ExtJs——数据模型

2018年02月05日 ⁄ 综合 ⁄ 共 5104字 ⁄ 字号 评论关闭

数据模型的三大基本部分:model   proxy  store

1、普通Model的创建:数据模型对真实世界中对事物在系统中的反映,ExtJs中的model相当于DB中的table 或Java中的Class

2、利用Ext.regModel创建模型

3、创建model的实例  :实例化对象的方法

4、Validations

5、自定义验证器

6、简单数据代理

7、Model的一对多和多对一

--------------------------------------------------------------------

插一段,突然发现ExtJs的API中有config,有properties,配置项和属性,对此很疑惑,查了一下百度:

Config Options下的内容为你在实例化一个对象时进行配置,也就是比如new Panel({a:"xxx",b:"yyy"}),这里的a和b就是来自于Config Options 
就拿tree下的TreeNode来说:
Config Options下的checked
checked : Boolean 
True to render a checked checkbox for this node, false to render an unchecked checkbox (defaults to undefined with no... 
True to render a checked checkbox for this node, false to render an unchecked checkbox (defaults to undefined with no checkbox rendered)
TreeNode是树节点的意思,那么肯定也就是一个节点
而checked很明显我们就能猜出来是 是否选中 的意思
这个checked是在Confgi Options下的,是实例化的时候用的,注意这点,其他时候能否用你是不知道的
而且这个配置选项的值必须只接受boolean类型的,也就是true或false
比如 var root = new Ext.tree.TreeNode({checked:true});
比如href : String 表示的配置选项href接受的类型是string的
这个所谓的配置选项,也就是Config Options下的内容,只有你在实例化的时候用的,也就是你在new 类名({...})时用的然后你再看 Public Properties 部分看这个childNodes ,public properties下的childNodes : Array 这样写表示的是你从一个实例化对象里取得的属性,比如你刚才 var tn = new Ext.tree.treeNode({....});这样已经实例化了一个对象了,那么现在你可以取实例化对象的数据了,怎么取呢,可以取里面的什么东西呢,那么这里public properties里的列出的就是你能取的,那么你要tn.childNodes就能获得一个Array类型的数据,所以public properties下列出的就是一个实例化对象能取的信息,冒号后面的是你索取得的信息的返回类型

还有一个简短回答:

就像构造方法参数,和成员变量的区别

主要在Ext.data下

Ext.onReady(function(){
	//利用Ext.define来创建我们的模型类,第一种
	//DB table person(name,age,email)
	Ext.define('Person',{
		extend:'Ext.data.Model',
		fields:[
			{name:'name',type:'auto'},
			{name:'age',type:'int'},
			{name:'email',type:'auto'}
		]
	});
	//MVC模式中model一定是M层,第二种,不必写extend(已经不推荐使用了)
	/**
	Ext.regModel('User',{         //运行时提示:Ext.regModel has been deprecated.
		fields:[
			{name:'name',type:'auto'},
			{name:'age',type:'int'},
			{name:'email',type:'auto'}
		]
	});
	*/
	//实例化一个类Person
	//1、new关键字
	var p = new Person({
		name:'nnnnn',
		age:32,
		email:'yyd@com.com'
	});
	alert(p.get('name'));
	//2、Ext.create方法
	var p1 = Ext.create('Person',{
		name:'nnnnn',
		age:32,
		email:'yyd@com.com'
	});
	
	alert(p1.get('age'));
	
	//3、使用Ext.ModelManager的create方法,模型管理器的创建方法,注意参数顺序
	var p2 = Ext.ModelManager.create({
		name:'nnnnn',
		age:32,
		email:'yyd@com.com'
	},'Person');
	alert(p2.get('email'));
	//获取类的名称
	alert(Person.getName());
});

模型验证:validations

Ext.onReady(function(){
	
	Ext.define('Person',{
		extend:'Ext.data.Model',
		fields:[
			{name:'name',type:'auto'},
			{name:'age',type:'int'},
			{name:'email',type:'auto'}
		],
		validations:[
		{type:'length',field:'name',min:2,max:6}
		
		]
	});
	
	var p = new Person({
		name:'nnnnnnnnnnnn',
		age:-32,
		email:'yyd@com.com'
	});
	/**
	 * 校验
	 * name  :2~6
	 * age:0~150
	 */
	//错误信息是在Ext.data.validations.lenghtMessage中保存的,修改一下,进行汉化
//	Ext.data.validations.lengthMessage = '错误的长度';
	var errors = p.validate();
	var errorInfo = [];
	errors.each(function(v){
		console.info(v);    //v:Object {field: "name", message: "is the wrong length"} 
		errorInfo.push(v.field + " " + v.message);	
	});
	alert(errorInfo.join("\n"));//alert  name is the wrong length
	
	//
});

在Model的配置项的validations中,能够配置验证项(系统给定的几种)

然后我们自己扩展Ext.data.validations,增加我们自己的验证机制:

Ext.onReady(function(){
	//扩展也就是我们自定义验证机制的一个新的验证方法
	Ext.apply(Ext.data.validations,{
		age:function(config,value){
			var min = config.min;
			var max = config.max;
			if(min <= value && value <=max){
				return true;
			}else {
				this.ageMessage = this.ageMessage + '应该在[' + min + '~' + max +']之间';
				return false;
			}
		},
		ageMessage:'age数据错误'
	});
	
	Ext.define('Person',{
		extend:'Ext.data.Model',
		fields:[
			{name:'name',type:'auto'},
			{name:'age',type:'int'},
			{name:'email',type:'auto'}
		],
		validations:[
		{type:'length',field:'name',min:2,max:6},
		{type:'age',field:'age',min:0,max:150}
		]
	});
	
	var p = new Person({
		name:'nnnnnnnnnnnn',
		age:-32,
		email:'yyd@com.com'
	});
	/**
	 * 校验
	 * name  :2~6
	 * age:0~150
	 */
	//错误信息是在Ext.data.validations.lenghtMessage中保存的,修改一下,进行汉化
//	Ext.data.validations.lengthMessage = '错误的长度';
	var errors = p.validate();
	var errorInfo = [];
	errors.each(function(v){
		console.info(v);    //v:Object {field: "name", message: "is the wrong length"} 
		errorInfo.push(v.field + " " + v.message);	
	});
	alert(errorInfo.join("\n"));//alert  name is the wrong length
	
	//
});

简单地数据代理proxy:就是来完成我们数据的CRUD

Ext.onReady(function(){
	Ext.define('Person',{
		extend:'Ext.data.Model',
		fields:[
			{name:'name',type:'auto'},
			{name:'age',type:'int'},
			{name:'email',type:'auto'}
		],
		proxy:{
			type:'ajax',
			url:'base/person.jsp'
		}
	});
	
	var p = Ext.ModelManager.getModel('Person'); //没有数据的Model对象
	p.load(1,{             //加载数据,就是执行代理获取数据
		scope:this,
		failure: function(record, operation) {
	    },
    	success: function(record, operation) {
    		alert(record.data.name);
    	},
   		callback: function(record, operation, success) {
    	}
	});
	
	
});

model中的proxy,配置项type有ajax一种,就是提交一个url获取数据,这里person.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%
		System.out.println("id=" + request.getParameter("id"));
		response.getWriter().write("{name:'cdf',age:34,email:'wer@com.com'}");
%>

record参数是一个对象,其中的data属性包含了传递过来的数据:{name:

"cdf"
, age:
34
, email:
"wer@com.com"
, id:
1}


load的第一个参数是id。这个很重要

一对多的例子:

Ext.onReady(function(){
	//教师类
	Ext.define('Teacher',{
		extend:'Ext.data.Model',
		fields:[
			{name:'teacherId',type:'int'},
			{name:'name',type:'auto'}
		],
		hasMany:{
			model:'Student',
			name:'getStudent',
			filterProperty:'teacher_Id'
		}
	});
	//学生类
	Ext.define('Student',{
		extend:'Ext.data.Model',
		fields:[
			{name:'studentId',type:'int'},
			{name:'name',type:'auto'},
			{name:'teacher_Id',type:'int'}
		]
	});
});

抱歉!评论已关闭.