ExtJS笔记 Ext.data.Model
A Model represents some object that your application manages. For example, one might define a Model for Users, Products, Cars, or any other real-world object that we want to model in the system. Models are registered via the model manager, and are used by stores, which are in turn used by many of the data-bound components in Ext.
模型表示你的app管理的对象。例如Users, Products, Cars等模型类,或其它你想在app中模型化的真实世界的对象。模型通过model manager注册,被stores使用,stores被Ext中大量数据绑定组件使用。
Models are defined as a set of fields and any arbitrary methods and properties relevant to the model. For example:
模型被定义为一些字段的集合,并可能包含一些模型相关的任意方法、属性。例如:
Ext.define('User', {
extend: 'Ext.data.Model',
fields: [
{name: 'name', type: 'string'},
{name: 'age', type: 'int', convert: null},
{name: 'phone', type: 'string'},
{name: 'alive', type: 'boolean', defaultValue: true, convert: null}
],
changeName: function() {
var oldName = this.get('name'),
newName = oldName + " The Barbarian";
this.set('name', newName);
}
});
The fields array is turned into a MixedCollection automatically by the ModelManager, and all other functions and properties are copied to the new Model's prototype.
字段数组会被 ModelManager自动转变为MixedCollection,其它的函数和属性会被复制到新模型的prototype。
A Model definition always has an identifying field which should yield a unique key for each instance. By default, a field named "id" will be created with a mapping of "id". This happens because of the default idProperty provided in Model definitions.
模型定义总是具有一个标识字段--做为每个实例的唯一键。缺省的,一个命名为”id“的字段会自动映射到”id“属性,这功能是由模型缺省的idProperty提供的。
To alter which field is the identifying field, use the idProperty config.
要改变做为标识列的字段,使用 idProperty 配置。
If the Model should not have any identifying field (for example if you are defining ab abstract base class for your application models), configure the {@liknkidProperty} as null.
如果模型不应该包含任何标识字段(例如你正在定义一个app中使用的抽象基类),则将{@liknkidProperty} 配置为 null。
By default, the built in numeric and boolean field types have a Ext.data.Field.convert function which coerces string values in raw data into the field's type. For better performance with Json or Array readers if you are in control of the data fed into this Model, you can null out the default convert function which will cause the raw property to be copied directly into the Field's value.
缺省的,数值和布尔属性类型有一个内置的函数,它会强迫字符串数值转换为属性的类型。把数据填充到模型中,为了让Json或者是Array读取器有更好的表现,可以把默认的转换方法置空,这些转换方法会把原生属性直接复制到属性的值中。(注:这样做的前提是要保证reander读到的数据值都是正确的,不需要转换)
Now we can create instances of our User model and call any model logic we defined:
现在我们可以创建User模型的实例,并且调用我们定义的任何模型逻辑:
var user = Ext.create('User', {
id : 'ABCD12345',
name : 'Conan',
age : 24,
phone: '555-555-5555'
});
user.changeName();
user.get('name'); //returns "Conan The Barbarian"
Validations 验证
Models have built-in support for validations, which are executed against the validator functions in Ext.data.validations (see all validation functions). Validations are easy to add to models:
模型是内置支持校验器的,它会执行Ext.data.validations中的校验器方法,校验器是很容易添加到模型中的。
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}
],
validations: [
{type: 'presence', field: 'age'},
{type: 'length', field: 'name', min: 2},
{type: 'inclusion', field: 'gender', list: ['Male', 'Female']},
{type: 'exclusion', field: 'username', list: ['Admin', 'Operator']},
{type: 'format', field: 'username', matcher: /([a-z]+)[0-9]{2,3}/}
]
});
The validations can be run by simply calling the validate function, which returns a Ext.data.Errors object:
简单地调用validate方法就会进行校验,它返回Ext.data.Errors对象
var instance = Ext.create('User', {
name: 'Ed',
gender: 'Male',
username: 'edspencer'
});
var errors = instance.validate();
Associations
Models can have associations with other Models via Ext.data.association.HasOne, belongsTo and hasMany associations. For example, let's say we're writing a blog administration application which deals with Users, Posts and Comments. We can express the relationships between these models like this:
模型通过Ext.data.association.HasOne、blongsTo、hasMany建立起和其他模型的关系。例如,写一个博客管理系统,这个系统要处理用户、帖子和内容,这些模型有下面这些关系:
Ext.define('Post', {
extend: 'Ext.data.Model',
fields: ['id', 'user_id'],
belongsTo: 'User',
hasMany : {model: 'Comment', name: 'comments'}
});
Ext.define('Comment', {
extend: 'Ext.data.Model',
fields: ['id', 'user_id', 'post_id'],
belongsTo: 'Post'
});
Ext.define('User', {
extend: 'Ext.data.Model',
fields: ['id'],
hasMany: [
'Post',
{model: 'Comment', name: 'comments'}
]
});
See the docs for Ext.data.association.HasOne, Ext.data.association.BelongsTo and Ext.data.association.HasMany for details on the usage and configuration of associations. Note that associations can also be specified like this:
请查阅文档查看这些关系的用法和配置详细内容,这些关系也可以像下面这样指定:
Ext.define('User', {
extend: 'Ext.data.Model',
fields: ['id'],
associations: [
{type: 'hasMany', model: 'Post', name: 'posts'},
{type: 'hasMany', model: 'Comment', name: 'comments'}
]
});
Using a Proxy
Models are great for representing types of data and relationships, but sooner or later we're going to want to load or save that data somewhere. All loading and saving of data is handled via a Proxy, which can be set directly on the Model:
模型可以很清楚表示出数据和关系的类型,但是使用模型的目的是用来加载和保存数据。所有数据的加载和保存都是使用Proxy来处理,Proxy可以在模型中直接设置。
Ext.define('User', {
extend: 'Ext.data.Model',
fields: ['id', 'name', 'email'],
proxy: {
type: 'rest',
url : '/users'
}
});
Here we've set up a Rest Proxy, which knows how to load and save data to and from a RESTful backend. Let's see how this works:
建立Rest Proxy,Rest Proxy会从RESTful后端加载和保存数据。请看看是它如何工作的:
var user = Ext.create('User', {name: 'Ed Spencer', email: 'ed@sencha.com'});
user.save(); //POST /users
Calling save on the new Model instance tells the configured RestProxy that we wish to persist this Model's data onto our server. RestProxy figures out that this Model hasn't been saved before because it doesn't have an id, and performs the appropriate action - in this case issuing a POST request to the url we configured (/users). We configure any Proxy on any Model and always follow this API - see Ext.data.proxy.Proxy for a full list.
新的模型对象调用save方法会使RestProxy把模型数据保存到服务器上。 RestProxy根据模型是否有id来判断模型是否已经保存,据此采取合适的操作,如果要保存数据,RestProxy会发送post请求到配置的url。请根据API在模型上配置Proxy-请看Ext.data.proxy.Proxy中关于Proxy的完整列表。
Loading data via the Proxy is equally easy:
通过Proxy加载数据是很容易的
//get a reference to the User model class
var User = Ext.ModelManager.getModel('User'); //Uses the configured RestProxy to make a GET request to /users/123
User.load(123, {
success: function(user) {
console.log(user.getId()); //logs 123
}
});
Models can also be updated and destroyed easily:
模型也是很容易更新和销毁的:
//the user Model we loaded in the last snippet:
user.set('name', 'Edward Spencer'); //tells the Proxy to save the Model. In this case it will perform a PUT request to /users/123 as this Model already has an id
user.save({
success: function() {
console.log('The User was updated');
}
}); //tells the Proxy to destroy the Model. Performs a DELETE request to /users/123
user.destroy({
success: function() {
console.log('The User was destroyed!');
}
});
Usage in Stores 在Store中使用
It is very common to want to load a set of Model instances to be displayed and manipulated in the UI. We do this by creating a Store:
在UI中显示和控制一组模型对象是经常需要的,
var store = Ext.create('Ext.data.Store', {
model: 'User'
});
//uses the Proxy we set up on Model to load the Store data
store.load();
A Store is just a collection of Model instances - usually loaded from a server somewhere. Store can also maintain a set of added, updated and removed Model instances to be synchronized with the server via the Proxy. See the Store docs for more information on Stores.
store是模型对象的集合,通常这些模型对象是从服务器某个地方加载的。Store通过Proxy和服务进行通过操作,比如添加,比如更新,比如删除。请查阅Store了解更多关于Store的信息。
ExtJS笔记 Ext.data.Model的更多相关文章
- ExtJS笔记 Ext.data.Types
This is a static class containing the system-supplied data types which may be given to a Field. Type ...
- ExtJs Ext.data.Model 学习笔记
Using a Proxy Ext.define('User', { extend: 'Ext.data.Model', fields: ['id', 'name', 'email'], proxy: ...
- [ExtJs] ExtJs4.2 数据模型Ext.data.Model学习
Model代表应用程序管理的一些对象.例如,我们可能会为 我们想在系统中建模的现实世界中的一些物体像使用者.产品和汽车等定义一个Model.这些Model在 Ext.ModelManager中注册,被 ...
- ExtJS教程(5)---Ext.data.Model之高级应用
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/jaune161/article/details/37391399 1.Model的数据验证 这里借助 ...
- 20. Extjs学习笔记——Ext.data.JsonStore使用说明
Ext.data.JsonStore继承于Ext.data.Store,使得从远程JSON数据创建stores更为方便的简单辅助类.JsonStore合成了Ext.data.HttpProxy与Ext ...
- Extjs学习笔记——Ext.data.JsonStore使用说明
Ext.data.JsonStore继承于Ext.data.Store.使得从远程JSON数据创建stores更为方便的简单辅助类. JsonStore合成了Ext.data.HttpProxy与Ex ...
- extJS 中 ext.data 介绍
ext.data 最主要的功能是获取和组织数据结构,并和特定控件联系起来,于是,Ext.data成了数据的来源,负责显示数据. Ext.data在命名空间中定义了一系列store.reader和pro ...
- ExtJS笔记 Ext.Loader
Ext.Loader is the heart of the new dynamic dependency loading capability in Ext JS 4+. It is most co ...
- EXtJS Ext.data.Model
(一).首先我们介绍一下Model类中比较常用的几个属性,如果我们想构建一个Model类,最主要的属性就是(Fields)属性,这个属性接受一个数组.用来设置Model中所包含的字段.定义的格式如下: ...
随机推荐
- DelphiXE下的字符串变化
字符串类型用于描述一个单独的书面的文字和符号. 一.字符类型 Delphi支持AnsiChar和WideChar两种基本的字符类型.AnsiChar类型变量使用单字节来表示一个字符,WideChar使 ...
- AWS S3 API实现文件上传下载
http://blog.csdn.net/marvin198801/article/details/47662965
- fragment中嵌入viewpager的问题
今天终于解决了这个问题 原来问题是出现于viewpager在这里的layout_height不能设置为"wrap_content" 之前我遇到空白的问题,我还以为是管理的问题 所以 ...
- EF框架step by step(7)—Code First DataAnnotations(1)
Data annotation特性是在.NET 3.5中引进的,给ASP.NET web应用中的类提供了一种添加验证的方式.Code First允许你使用代码来建立实体框架模型,同时允许用Data a ...
- ural 1251. Cemetery Manager
1251. Cemetery Manager Time limit: 1.0 secondMemory limit: 64 MB There is a tradition at the USU cha ...
- iOS学习06C语言结构体
1.结构体的概述 在C语言中,结构体(struct)指的是一种数据结构,是C语言中构造类型的其中之一. 在实际应用中,我们通常需要由不同类型的数据来构成一个整体,比如学生这个整体可以由姓名.年龄.身高 ...
- BZOJ3764 : Petya的序列
首先如果一段连续子序列里没有任何幸运数,那么显然可以缩成一个点. 设幸运数个数为$m$,那么现在序列长度是$O(m)$的,考虑暴力枚举$R_1$,然后从右往左枚举$L_1$. 每次碰到一个幸运数,就将 ...
- [转]expect的安装
转自:http://blog.chinaunix.net/uid-20639775-id-2453085.html Expect是在Tcl基础上创建起来的,它还提供了一些Tcl所没有的命令,它可以用来 ...
- Spring In Action ③
第三章 最小化Spring xml配置 自动装配(autowiring) 自动检测(autodiscovery) 自动装配 byName.byType.constructor autodetec ...
- input属性控制弹出键盘类型
/** * ios弹起数字键盘有三种方法 * 1. <input type="number"> 可以弹起带有小数点的键盘,可以键盘不干净,有其它各种字符,可切换 ...