首页 > 代码库 > Extjs 4.2使用心得 --- store和reader使用技巧

Extjs 4.2使用心得 --- store和reader使用技巧

  最近老大要求使用Extjs写前端,故研究了一番。这玩意功能比起jquery-ui等确实功能强大很多,效果也比较高大上,但是确实比较难使用。本人智商欠费各种坑都跳遍了才试出成果,现主要记录下store和reader的心得。

  在介绍store之前先说下Model,Model代表应用程序管理的一些对象。例如,我们想在系统中建模一个现实世界,我们将为这世界中的一些物体像使用者、产品和汽车等对象定义一个Model,这些Model对象将被系统注册,被Store(仓库)使用,然后这些仓库又被 Ext中许多与数据绑定的组件所使用。

  Store 大意是: 仓库、存储的意思. Store类封装了一个客户端缓存,用于存储 Model 对象. Stores 通过一个代理 Proxy 来加载数据, 并提供函数来 排序, 过滤 以及查询 内部所包含的 model 实例.

  创建Store很简单,只需要传入 Model 以及用来加载/保存 数据的Proxy作为配置项即可:

 // 建立一个store要使用的 model Ext.define(‘User‘, {     extend: ‘Ext.data.Model‘,     fields: [         {name: ‘id‘,   type: ‘int‘},         {name: ‘name‘,  type: ‘string‘},         {name: ‘age‘,  type: ‘int‘}     ] }); var myStore = Ext.create(‘Ext.data.Store‘, {     model: ‘User‘,     proxy: {         type: ‘ajax‘,         url: ‘/users.json‘,         reader: {             type: ‘json‘         }     },     autoLoad: true });

在上面的例子中,我们配置了一个 AJAX 代理,从 url ‘/users.json‘ 加载数据. 并告诉Proxy使用JsonReader来解析服务器返回的数据为Model对象.

  reader 通常用于翻译数据,使其被加载为 Model 实例或Store, 该数据一般是一个AJAX请求的响应数据. 一般情况下不需要直接创建一个Reader实例, 因为Reader总是和Proxy一起使用, 且其将使用Proxy的reader 配置属性配置。针对上面的代码,reader属性将从服务端读取数据,同时将接受如下的响应:

[    {        "id": 1,        "name": "Ed Spencer",        "age": "22"    },    {        "id": 2,        "name": "Abe Elias",        "age": "45"    }]

  但是假如你已经有了一份定义好的JSON格式,而且看起来和我们提供的那种不太相似,那么你可以通过JsonReader的配置选项来使其可以解析你的格式,例如,你的数据有个root节点,如下:

{    "users": [       {           "id": 1,           "name": "Ed Spencer",           "age": "22"       },       {           "id": 2,           "name": "Abe Elias",           "age": "45"       }    ]}

为了解析这个,我们只需要传递一个root配置以匹配以上的"users":

reader: {    type: ‘json‘,    root: ‘users‘}

或者更复杂的JSON格式,有些文档数据经常会以以下结构提供数据:

{    "total": 42,    "offset": 0,    "users": [        {            "id": "ed-spencer-1",            "value": 1,            "user": {                "id": 1,                "name": "Ed Spencer",                "age": "23"            }        }    ]}

以上示例中的记录数据是在"users"数组中嵌套的一个额外级别,其中的每个“user”项目中都包含有额外元数据(例如本例中的’id‘和‘value’). 为了解析以上JSON数据中的每个‘user‘项中的数据, 需要特别指定record配置,如下所示:

reader: {    type  : ‘json‘,    root  : ‘users‘,    record: ‘user‘}

响应的元数据

服务端可以在其响应中返回元数据,除了记录数据,其中数据本身的描述数据的属性集或用于重新配置的读取器。 为了在响应中获取元数据,需要给响应数据的根简明加上一个‘metaData‘属性. 元数据属性可以包含任何东西, 但若Reader存在,其还支持的一个特定设置属性:

  • root: 响应中包含记录数据的节点对应的根属性名称
  • idProperty: 数据中的主键字段属性名
  • totalProperty: 数据中的所有记录数属性名
  • successProperty: 响应中成功状态属性名
  • messageProperty: 一个可选的响应信息的属性名
  • fields: 在将响应数据转换成records之前用于重新配置Model的字段集的配置