版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/jaune161/article/details/37391399

1、Model的数据验证

这里借助官方的一个样例来说Model数据验证的基本使用方法

	Ext.define('User', {
extend: 'Ext.data.Model',
fields: [
{ name: 'name', type: 'string' },
{ name: 'age', type: 'int' },
{ name: 'phone', type: 'string' },
{ name: 'gender', type: 'string' },
{ name: 'username', type: 'string' },
{ name: 'alive', type: 'boolean', defaultValue: true }
], validators: {
age: 'presence',
name: { type: 'length', min: 2 },
gender: { type: 'inclusion', list: ['Male', 'Female'] },
username: [
{ type: 'exclusion', list: ['Admin', 'Operator'] },
{ type: 'format', matcher: /([a-z]+)[0-9]{2,3}/i }
]
}
}); var instance = Ext.create('User', {
name: 'Ed',
gender: 'Male',
username: 'edspencer'
}); var validation = instance.getValidation();
console.log(validation);

数据验证在validators属性中定义,数据验证的类型在Ext.data.validator下,Ext提供了8中验证。以下一一解释意思

age:'presence',字段后面直接写字符串表示这个类型的验证,类型查看的方法。打开这个类,在第一行就能够看到,例如以下

Ext.data.validator.Presencedata:
validator.presence

validator.presence中的presence就是这个验证类的type,这样的写法等同于{type:'presence'},presence类的意思是这个字段的值不能是null或undefined

name:使用的是长度验证,表示最小长度为2,验证类中各属性的配置,參见Ext官方API中这个类的config列表

gender:与name相似,表示这个字段仅仅能是'Male',或者'Female'

username:的意思是不能包括Admin和Operator而且需满足后面的正則表達式。

假设一个字段有多个验证的话能够參考username的形式。

以下我们自己定义一个年龄的验证,首先值必须是数字,其次值需大于0小于160

	Ext.define('Ext.data.validator.Age',{
extend:'Ext.data.validator.Validator',
alias: 'data.validator.age',
type: 'age', config:{
message: 'Is in the wrong age',
max:160 //默认最大年龄为160
}, /**
* 验证类中的核心方法
* @param {Object} value
* @return {Boolean} 返回true表示通过验证,否则返回message
*/
validate:function(value){
console.log(value);
var result = Ext.isNumber(value);
if(result){
result = value>0 && value < this.getMax();
} return result ? result : this.getMessage();
}
});

使用方法如同Ext自带的验证类,须要注意的是这个类的定义须要在使用之前定义

2、Model转换的应用

如以下的转换。我们给电话号码前面加上+86

	Ext.define('User', {
extend: 'Ext.data.Model',
fields: [
{ name: 'name', type: 'string' },
{ name: 'age', type: 'int' },
{ name: 'phone', type: 'string', convert:function(value){ //假设值是字符串,而且没有以+86开头
if(Ext.isString(value) && !Ext.String.startsWith(value,'+86')){
return '+86'+value;
}
}},
{ name: 'gender', type: 'string' },
{ name: 'username', type: 'string' },
{ name: 'alive', type: 'boolean', defaultValue: true }
]
}); var user = Ext.create('User', {
phone:'15938383838'
}); //var validation = instance.getValidation();
console.log(user.get('phone'));

上面的Model我们给phone加上了转换,那么在定义Model或者给phone赋值时,就会自己主动调用convert,检查phone是否是字符串、是否以+86开头,假设是字符串而且没有以+86开头则自己主动给phone加上+86

这个在0,1转true、false的时候用的比較多

3、Model之Ajax

	Ext.define('User', {
extend: 'Ext.data.Model',
idProperty:'id',
fields: ['id', 'name', 'email'], proxy: {
type: 'rest',
api: {
create: 'user/add',
read: 'user/get', //在调用Model的静态方法load时。会默认去这里查数据
update: 'user/update',
destroy: 'user/del' //在调用Model的erase方法(Ext5.0曾经的版本号是destroy方法,意思就是依据ID删除Model)
}
}
});

在调用save方法时。会自己主动推断Model的id属性是否有值假设有就使用update路径。假设没有就使用create路径,在5.0之前的版本号save和update是一个方法,5.0的版本号中事实上save,update,delete用的都是save方法,这一点从源代码中能够看出

    /**
* Destroys the model using the configured proxy.
* @param {Object} options Options to pass to the proxy. Config object for {@link Ext.data.operation.Operation}.
* @return {Ext.data.operation.Operation} The operation
*/
erase: function(options) {
this.drop();
return this.save(options);
}, /**
* Saves the model instance using the configured proxy.
* @param {Object} [options] Options to pass to the proxy. Config object for {@link Ext.data.operation.Operation}.
* @return {Ext.data.operation.Operation} The operation
*/
save: function(options) {
options = Ext.apply({}, options); var me = this,
phantom = me.phantom,
dropped = me.dropped,
action = dropped ? 'destroy' : (phantom ? 'create' : 'update'),
scope = options.scope || me,
callback = options.callback,
proxy = me.getProxy(),
operation; options.records = [me];
options.internalCallback = function(operation) {
var args = [me, operation],
success = operation.wasSuccessful();
if (success) {
Ext.callback(options.success, scope, args);
} else {
Ext.callback(options.failure, scope, args);
}
args.push(success);
Ext.callback(callback, scope, args);
};
delete options.callback; operation = proxy.createOperation(action, options); // Not a phantom, then we must perform this operation on the remote datasource.
// Record will be removed from the store in the callback upon a success response
if (dropped && phantom) {
// If it's a phantom, then call the callback directly with a dummy successful ResultSet
operation.setResultSet(Ext.data.reader.Reader.prototype.nullResultSet);
me.setErased();
operation.setSuccessful(true);
} else {
operation.execute();
}
return operation;
},

4、Model中的经常使用方法

Model中经常使用的方法在上面也提到了一些。以下介绍上面没有提到的

get(filedName):依据字段名获取字段的值。这个在上面用到过。这里反复强调一遍。这个是用的最多的方法之中的一个

getId():获取Model的id,前提是要设置idProperty这个属性

getIdProperty:获取ID字段的值

isVaild():推断Model是否通过验证
set( fieldName, newValue, [options] ):为字段赋值。能够穿一个Object形式的參数如{name:'jaune',age:24}

ExtJS教程(5)---Ext.data.Model之高级应用的更多相关文章

  1. [ExtJs] ExtJs4.2 数据模型Ext.data.Model学习

    Model代表应用程序管理的一些对象.例如,我们可能会为 我们想在系统中建模的现实世界中的一些物体像使用者.产品和汽车等定义一个Model.这些Model在 Ext.ModelManager中注册,被 ...

  2. ExtJS笔记 Ext.data.Model

    A Model represents some object that your application manages. For example, one might define a Model ...

  3. ExtJs Ext.data.Model 学习笔记

    Using a Proxy Ext.define('User', { extend: 'Ext.data.Model', fields: ['id', 'name', 'email'], proxy: ...

  4. 20. Extjs学习笔记——Ext.data.JsonStore使用说明

    Ext.data.JsonStore继承于Ext.data.Store,使得从远程JSON数据创建stores更为方便的简单辅助类.JsonStore合成了Ext.data.HttpProxy与Ext ...

  5. Extjs学习笔记——Ext.data.JsonStore使用说明

    Ext.data.JsonStore继承于Ext.data.Store.使得从远程JSON数据创建stores更为方便的简单辅助类. JsonStore合成了Ext.data.HttpProxy与Ex ...

  6. EXtJS Ext.data.Model

    (一).首先我们介绍一下Model类中比较常用的几个属性,如果我们想构建一个Model类,最主要的属性就是(Fields)属性,这个属性接受一个数组.用来设置Model中所包含的字段.定义的格式如下: ...

  7. Extjs 项目中常用的小技巧,也许你用得着(5)--设置 Ext.data.Store 传参的请求方式

    1.extjs 给怎么给panel设背景色 设置bodyStyle:'background:#ffc;padding:10px;', var resultsPanel = Ext.create('Ex ...

  8. ExtJS笔记 Ext.data.Types

    This is a static class containing the system-supplied data types which may be given to a Field. Type ...

  9. 设置 Ext.data.Store 传参的请求方式

    设置 Ext.data.Store 传参的请求方式 1.extjs 给怎么给panel设背景色 设置bodyStyle:'background:#ffc;padding:10px;', var res ...

随机推荐

  1. Windows 远程桌面文件传输的方法

    实现电脑的远程连接以后,很多时候会需要进行主机间的文件传输,这个时候就可以用系统自带的远程连接里的磁盘映射来完成,详细如下: 远程桌面程序内置了映射磁盘的功能,通过这个功能可以实现远程登录服务器时自动 ...

  2. URAL1306 Sequence Median(卡内存神题)

    给出n个数,n<=250000,求这n个数的中位数,内存限制1mb 卡内存的神题,用数组存下来刚好1mb,再加上执行时消耗内存.立即爆. 因此我们用优先队列存储一半的数. 网上的某些代码,用pr ...

  3. 手机话费充值和手机流量充值 API

    最近正好需要用到手机充值和流量充值接口,网上找到的,记录并分享下. 聚合数据上面有手机充值的接口,也有流量充值的接口:注册以后可以使用它的OpenId和AppKey. 手机话费充值的接口:https: ...

  4. struts2获取前台提交的参数

      CreateTime--2017年8月25日16:30:11 Author:Marydon struts2对获取前台提交参数的封装 需要导入: import java.util.Enumerati ...

  5. 高速掌握Lua 5.3 —— Lua与C之间的交互概览

    Q:什么是Lua的虚拟栈? A:C与Lua之间通信关键内容在于一个虚拟的栈.差点儿全部的调用都是对栈上的值进行操作,全部C与Lua之间的数据交换也都通过这个栈来完毕.另外,你也能够使用栈来保存暂时变量 ...

  6. 代理server的概要知识

    技术支持请留言:http://www.lcpower.cn 一.什么是代理server? 代理server英文全称是Proxy Server.其功能就是代理网络用户去取得网络信息.形象的说:它是网络信 ...

  7. 阿里云 RDS实例间的数据迁移

    使用数据传输DTS可以实现两个RDS实例间的数据迁移.对于支持增量迁移的存储引擎,还可以使用DTS在源RDS实例不停服的情况下,将数据迁移到目标RDS实例.目前对于RDS不同存储引擎,只支持同构迁移( ...

  8. Build Your Hexo Blog (On Github)

    超简单,比jekyll好多了! 看个Demo http://kevinjmh.github.io/ 了解Hexo Hexo是一个由Node.js驱动的,简单.快速.强大的Blog框架.可以快速的生成静 ...

  9. 事件绑定,事件捕获,事件冒泡以及事件委托,兼容IE

    ● 事件分为三个阶段:   事件捕获 -->  事件目标 -->  事件冒泡 ● 事件捕获:事件发生时(onclick,onmouseover……)首先发生在document上,然后依次传 ...

  10. asp.net母版-页脚制作

    1.母版创建流程略过 2.创建母版页css:Site.css body{ } .linkButton{ text-decoration:none; color:whitesmoke; } 3.母版页添 ...