Ext 3.0新增内容系列文章之二:Ext.data.Writer简介

上期我们的内容是关于API接口的配置,其中涉及到CRUD只是略略一提,没有谈论太多,今期再重点说说。

根据CRUD 的原则,数据或资源操作不外乎“生、变、见、灭”的四大规律,也就是说,只需要“创建(Create )、获取(Read )、更新 (Update )和销毁(DELETE )”四种行为便可完成对资源的处理和操作了。如果“读”操作在Ext 中没有题的话,那么其他三种操作就应该归类为“写”的操作了。这部分的内容,在Ext 3.0 中将由Writer 来负责完成。Ext.data.DataWriter提供了增、删、改,而“查”的实现让Ext.data.Store与服务端框架密切通讯。Writer控制了Store了自动管理AJAX的请求,让其成为Store CRUD操作的管道。换句话说,这个DataWriter相对于远程CRUD操作而言,是一个在前端的初始化部分,负责写入单个或多个的 Ext.data.Record对象。Ext.data.DataWriter是一个抽象类,一般用于让来被继承,例如 Ext.data.JsonWriter。我们大致看看JsonWriter是怎么完成的。

Writer继承自Object,是一个崭新的Ext.data.*类,先引入一个JsonWriter 实例对象:

设置writeAllFieldstrue 表示,记录所有的字段都会写入到数据库中去。当然,如果有特定ORM 方面,可能就要设置其为false 以适应ORM 的策略。writeAllFields默认是false。设为true的话,就表示让DataWriter返回所有那个记录的所有字段,不仅仅是修改的那些字段。true就是记录那些修改的字段而已。

明显,Writer类的关键方法是write(action, params, rs)方法。action参数代表[CREATE|UPDATE|DESTROY]的字符串,Writer类只需要有DataWriter.update、DataWriter.create、DataWriter.destroy的proxy就可以囊括“写”的操作;params是要写入的hash参数;rs是要写的数据对象(可以为list的数据对象)。Ext.data.DataWriter本身有几个模版方法render()、updateRecord()、createRecord()、destroyRecord(),让继承它的子类重写使用。render()表示写事件的最后动作。将写入的数据对象添加到参数,该方法也说明了送抵的数据对象会依据用户在DataReader配置的元数据信息产生真正的渲染数据,有参数“data”和“params”。

值得一提的是,JsonWriter配置项 true 表示对.DataWriter.toHash()哈希数据进行Ext.util.JSON.encode()。 默认为true 。当使用Ext.data.DirectProxy的时候,不同于Ext.Direct.JsonProvider有自己的JSON编码,所以该配置项要设置为false 。 此外,如果你使用的是Ext.data.HttpProxy,设置该项为false 就会使得HttpProxy采用 Ext.Ajaxrequest配置参数的jsonData传输数据,而非params。 当使用Ext.data.Storerestful的Store,一些服务端框架就会认为数据从jsonData的通道经过。如果采用这样的机制的话,应该让底层的连接对象完成编码的工作(如Ext.Ajax),把encode: 设为false

通过proxy对象激活Store对象来控制writer,也就是配置一个url:

对于更细颗粒的控制,proxy也可配置成为api,也就是定义CRUD 的资源位置,并告诉ProxyWriter 得知操作地点的URL 。我们的指导思想倾向于与REST 架构的。

然后就是WriterProxy 组装一起:

当上层的组件通过Ext.Writer 来提交某些数据的时候,较理想的方法是统一一个地方来进行数据字段验证的工作。假设有一个名为SettiongGrid ,我们可以这样关联事件(relay events) ,请注意relayEvents()方法的使用:

 

例子方面,Ext 发行包本身就有,我们可以去examples/resetfulexamples/writer 下面看看,简单演示了Rest 资源与MVC 框架是怎么映射其中的资源路径和操作行为的。如果谈到PHP 的框架,这就是一个特定的场合,基本上可以有以下几个类:

 

  • Model         包含ORM 服务的对象
  • Request      处理请求的参数
  • Controller   根据已知url 派遣动作
  • Response    输出符合格式的视图,如JSON

 

通过唯一的切入口来操作整个框架(博主听上去感觉有点好奇),而框架内部的类都是由Controller 来动态加载的,通过某一动作指明不同的类。不过url 就依据URL 映射的使用,表现得千变万化,而切入点就只有一个。

 

部分内容根据jacob.andresen@gmail.com的“CRUD_in_extjs_3_0.pdf”的来源而翻译。

 

ExtJS 中,`store` 是一个非常重要的概念,它是用于存储数据的容器,通常用于存储从后台获取的数据或者本地静态数据。`store` 有以下几个常用属性: 1. `model`:指定存储在 `store` 中的数据模型。 2. `proxy`:指定从后台获取数据的方式,可以是 `ajax`、`jsonp`、`rest` 等方式。 3. `reader`:指定解析后台返回数据的方式,通常与 `model` 配合使用。 4. `writer`:指定将 `model` 中的数据保存到后台的方式。 5. `fields`:指定存储在 `store` 中的数据模型的字段。 6. `listeners`:指定 `store` 的事件监听器。 7. `autoLoad`:指定是否在创建 `store` 时自动加载数据。 8. `pageSize`:指定 `store` 分页时每页显示的记录数。 9. `sorters`:指定对 `store` 中的数据进行排序的方式。 10. `filters`:指定对 `store` 中的数据进行过滤的方式。 11. `groupField`:指定对 `store` 中的数据进行分组的字段。 12. `groupDir`:指定对 `store` 中的数据进行分组的顺序。 13. `groupers`:指定对 `store` 中的数据进行多级分组的方式。 14. `remoteFilter`:指定是否在后台进行数据过滤。 15. `remoteSort`:指定是否在后台进行数据排序。 16. `remoteGroup`:指定是否在后台进行数据分组。 17. `storeId`:指定 `store` 的唯一标识符。 使用这些属性可以方便地配置 `store`,实现对数据的存储、获取、排序、过滤和分组等各种需求。例如,以下代码演示了如何使用 `store` 存储本地静态数据,并对数据进行排序和分组: ``` Ext.create('Ext.data.Store', { fields: ['name', 'age', 'gender'], data: [ { name: 'Tom', age: 18, gender: 'male' }, { name: 'Mary', age: 20, gender: 'female' }, { name: 'John', age: 22, gender: 'male' }, { name: 'Lucy', age: 19, gender: 'female' } ], sorters: [ { property: 'age', direction: 'DESC' } ], groupField: 'gender', autoLoad: true }); ``` 上面的代码中,`fields` 属性指定了存储在 `store` 中的数据模型的字段,`data` 属性指定了存储在 `store` 中的本地静态数据,`sorters` 属性指定了对数据进行排序的方式,`groupField` 属性指定了对数据进行分组的字段。当 `store` 加载数据时,数据会根据 `sorters` 和 `groupField` 属性进行排序和分组,方便数据展示和处理。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sp42a

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值