原文链接: http://docs.sencha.com/touch/2-0/#!/api/Ext.data.Model
一个模型(Model)就代表着你应用中管理的某个对象。比如说,一个人可能定义了一个模型来代表用户(Users),产品(Product),汽车(Cars)或者任意其他现实世界中我们想用模型来表示的对象。模型通过modelmanager注册,并被stores使用。而stores反过来又被Ext中许多绑定数据的组件所使用。
模型被定义为一系列字段(fields)以及任意和模型相关的方法和属性的集合。比如: Ext.define('User',{ extend: 'Ext.data.Model', config: { fields:[ {name: 'name', type: 'string'}, {name: 'age', type: 'int'}, {name: 'phone', type:'string'}, {name: 'alive', type:'boolean', defaultValue: true} ] },
changeName: function() { varoldName = this.get('name'), newName = oldName + " TheBarbarian";
this.set('name', newName); } }); 这个字段数组自动的被 ModelManager转化为一个MixedCollection,并且所有其他的函数和属性被复制到新模型的原型中。
现在我们可以创建我们的User模型的实例并执行我们定义在其中的任意逻辑: var user = Ext.create('User',{ name : 'Conan', age : 24, phone: '555-555-5555' });
user.changeName(); user.get('name'); //returns"Conan The Barbarian"
Validations 模型有对验证的内嵌支持, 并且是通过Ext.data.validations (seeall validation functions)中的验证器函数来执行的。验证可以很容易的加到模型中: Ext.define('User',{ extend:'Ext.data.Model',
config: { 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}/} ] } }); 验证可以简单地通过调用 validate函数来执行。该函数返回一个 Ext.data.Errors对象: var instance =Ext.create('User', { name: 'Ed', gender: 'Male', username: 'edspencer' });
var errors =instance.validate();
Associations
模型可以和其他的模型通过Ext.data.association.HasOne, belongsTo 以及hasMany的关系建立对应关系。例如,假设我们正在写一个博客的管理应用,要处理的项包括Users,Posts 以及 Comments。这些模型之间的关系我们可以这样来表达: Ext.define('Post',{ extend: 'Ext.data.Model',
config: { fields: ['id','user_id'], belongsTo: 'User', hasMany :{model: 'Comment', name: 'comments'} } });
Ext.define('Comment', { extend: 'Ext.data.Model',
config: { fields: ['id', 'user_id','post_id'], belongsTo: 'Post' } });
Ext.define('User', { extend: 'Ext.data.Model',
config: { fields: ['id'], hasMany: [ 'Post', {model: 'Comment', name: 'comments'} ] } }); 可以参看 Ext.data.association.HasOne , Ext.data.association.BelongsTo and Ext.data.association.HasMany的文档来了解 关系的应用以及配置的更多细节。注意,关系也可以像下面这样指定: Ext.define('User', { extend:'Ext.data.Model',
config: { fields: ['id'], associations: [ {type:'hasMany', model: 'Post', name: 'posts'}, {type:'hasMany', model: 'Comment', name: 'comments'} ] } });
应用一个代理(Using a Proxy)
模型可以很好的代表数据和关系的类型,但是我们早晚要在某个地方想要去加载或者保存那些数据。加载和保存数据都是通过一个 Proxy,他可以在Model中直接配置: Ext.define('User', { extend:'Ext.data.Model',
config: { fields: ['id', 'name', 'email'], proxy: { type:'rest', url :'/users' } } }); 这里我们已经设置了一个 RestProxy,它知道怎样从后端加载数据以及如何保存数据到后端。让我们看看这是如何做到的: var user = Ext.create('User', {name: 'Ed Spencer', email:'[email protected]'}); user.save(); //POST /users 通过调用新的模型实例的save方法来告诉配置好了的 RestProxy我们希望把我们模型的数据存储在服务器上。 RestProxy指出这个模型之前没有被保存过因为它没有id,并执行适当的操作--在这种情况下发送一个POST请求到我们配置好的url (/users) 。我们可以在任意的模型上配置任意的 Proxy并总是要遵从这个API--参见 Ext.data.proxy.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 } }); 模型也可以很容易的进行更新和销毁: //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 willperform a PUT request to /users/123 as this Model already has anid user.save({ success: function(){ console.log('The User was updated'); } });
//tells the Proxy to destroy the Model. Performs a DELETErequest to /users/123 user.erase({ success: function(){ console.log('The User was destroyed!'); } });
Stores的使用(Usage in Stores)
我们想要下载一系列的模型实例并在UI中展示和操作是很常见的。我们通过一个Store来创建: var store = Ext.create('Ext.data.Store', { model: 'User' });
//uses the Proxy we set up on Model to load the Storedata store.load(); 一个Store仅仅是一个Model实例的集合--通常是从某个地方的服务器下载的。Store也可以通过一系列的增加,更新和移除Model实例来通过Proxy与服务器保持同步。可以参看 Storedocs来了解关于Store的更多信息。