数据模型的三大基本部分: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'}
]
});
});