ext5听从mvc的设计模式,这里要讲的是model 这一层定义javascript
若是你 在java ee 中定义了一个model如User类,那么在前端ext这里也要定义一个这样的model.前端
除了User类中该有的字段外,还要继承一个叫Ext.data.Model 才算是定义了一个model。如:java
Ext.define('Test.model.User',{ extend:'Ext.data.Model', idProperty:'userId', //该类的主键为userId字段 fields:[ {name:'userId',type:'string'}, //字段:userId ,类型:string {name:'name',type:'auto'}, //字段:name,类型:不限 {name:'age',type:'int'}, {name:'gender',type:'auto'} ] })
这时咱们实例化这个类:ajax
var p1 = new Test.model.User({ userId:'24dfkl243w3', name:'wx', age:23, gender:'Malsdfe' });
模型类的验证器的定义与使用设计模式
验证器能够查一个实例,各个字段的是否符合咱们所给出的约束,如名称不能为空,长度在2-5之间等api
1.在Test.model.User 类中定义验证器服务器
Ext.define('Test.model.User',{ extend:'Ext.data.Model', idProperty:'userId', fields:[ {name:'userId',type:'string'}, {name:'name',type:'auto'}, {name:'age',type:'int'}, {name:'gender',type:'auto'} ], validators:{ age :{type:'presence'}, //年龄不能为null或undefined name:{type:'length',min:2,max:5}, //名称长度在2-5之间 gender:[ {type:'presence'}, //不能空 { type: 'inclusion', list: ['Male', 'Female'] } //值只能是'Male'与'Female' ] } });
为User定义好了验证器,下面咱们就能够对实例化后的User进行验证了如:mvc
var p1 = new Test.model.User({ userId:'24dfkl243w3', name:'wx', age:23, gender:'Malsdfe' });
p1.isValid() //false 这时咱们只知道p1不知足验证器的规则,但咱们不知道具体是哪一个jsp
var result = p1.getValidation(); console.info(result);
从这里咱们看了result 中的信息,从信息中咱们知道了是gender出现了问题.在api(Ext.data.validator.Inclusion)中能够看到这个提示消息是英文,就算国际化了也很差使。这时咱们能够重写ext的类达到汉化的目的如:ide
Ext.data.validator.Inclusion.override({ config:{ message:'值不在范围内' } });
具体的细节还侍学习。
模型类中的代理proxy
目前只知道proxy,后利用ajax能够从服务端中更新一个实例化好的类,或建立一个类:如
//defined model Ext.define('Test.model.User',{ extend:'Ext.data.Model', idProperty:'userId', fields:[ {name:'userId',type:'string'}, {name:'name',type:'auto'}, {name:'age',type:'int'}, {name:'gender',type:'auto'} ], validators:{ age :{type:'presence'}, //not empty name:{type:'length',min:2,max:5}, gender:[ {type:'presence'}, { type: 'inclusion', list: ['Male', 'Female'] } ] }, proxy:{ type:'ajax', url:'data/data.jsp' } });
url:data.jsp 返回的内容为:{userId:'24dfkl243w3',name:'Mr.Mark',age:34,gender:'Female'}
var p1 = new Test.model.User({ userId:'24dfkl243w3', name:'wx', age:23, gender:'Malsdfe' }); p1.load({ scope: this, failure: function(record, operation) { //do something if the load failed }, success: function(record, operation) { //do something if the load succeeded }, callback: function(record, operation, success) { //do something whether the load succeeded or failed } });
代码说明: 当p1调用 load时,将主键userId做为参数传到服务器,服务器要处理的就是根据这个userId返回相应的数据,从而达到更新的目的。注意:当服务器传回的UserId与以前的不一致时会报错。因此这个load主要做用是当服务器的数据发生变化时,能够及时的更新到前台。
2.使用proxy建立一个实例:
p2 = Test.model.User.load(10, { scope: this, failure: function(record, operation) { //do something if the load failed }, success: function(record, operation) { //do something if the load succeeded }, callback: function(record, operation, success) { //do something whether the load succeeded or failed }});
代码说明:10做为主键传到服务器,服务器返回相应的数据,从而实例化p2对象。注意若是服务器中传回的主键(这里是userId)与参数不一致(这里是10)就会报错。
模型之间的关系 1对1 1对 n
//老师 Ext.regModel("teacher",{ fields:[ {name:"teacherId",type:"int"}, {name:"name",type:"auto"} ], hasMany:{ model:"student", name:"getStudent", filterProperty:"teacher_Id" } }); //学生 Ext.regModel("student",{ fields:[ {name:"studentId",type:"int"}, {name:"name",type:"auto"}, {name:"teacher_Id",type:"int"} ] });
name来指定建立的时候的属性,这个很重要,若是指定了name,且值为getStudent 则能够在建立teacher类的对象中直接调用teacher.students 系统会自动加一个s 这个返回的就是student类的集合filterProperty:指定的外键的名字