(文档翻译)Ext.data.Model

来源:互联网 发布:blink 大数据 编辑:程序博客网 时间:2024/05/14 23:14
原文链接: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.HasOnebelongsTo 以及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.HasOneExt.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:'ed@sencha.com'});
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的更多信息。
原创粉丝点击