ExtJS 4 DirectStore post参数的变化以及应对方法
还是Ext4,还是direct,这次是发送到后台参数的变化问题。
在Ext3中,继承Ext.data.DirectStore需要通过sortInfo属性指定排序字段和排序方法,通过paramOrder指定传入后台参数的顺序,例如:
1 var store = new Ext.data.DirectStore({
2 remoteSort: true,
3 directFn: Sample.Grid.PagingLoad,
4 paramOrder: ['sort', 'dir', 'start', 'limit'],
5 idProperty: 'id',
6 totalProperty: 'total',
7 root: 'data',
8 sortInfo: {
9 field: 'name',
10 direction: 'ASC'
11 },
12 fields: [{
13 type: 'int',
14 name: 'id'
15 }, 'name', {
16 type: 'int',
17 name: 'employees'
18 },{
19 type: 'float',
20 name: 'turnover'
21 },{
22 type: 'date',
23 name: 'started',
24 dateFormat: 'c'
25 }]
26 });
参数发送的方式是分别使用字符串post到后台,这是firebug相应信息:
后台通过设定好的参数顺序接受对应参数(均为string类型):
1 [DirectMethod]
2 public CompanySerializer PagingLoad(string order, string direction, long start, long limit)
3 {
4 CompanyCollection coll = new CompanyCollection();
5 coll.OrderField = order;
6 coll.OrderDirection = direction.ToLower() == "desc" ? CompanyCollection.Direction.DESC : CompanyCollection.Direction.ASC;
7
8 return new CompanySerializer(coll, Convert.ToInt32(start), Convert.ToInt32(limit));
9 }
在Ext4的Ext.data.DirectStore中取消sortInfo和paramOrder属性,改为继承自Ext.util.MixedCollection的sorters。但是无论是官方example还是direct的example,都没有相应的说明和例子,那首先按文档把js写好:
1 var store = Ext.create('Ext.data.DirectStore', {
2 autoLoad: true,
3 autoSave: true,
4 remoteSort: true,
5 api: {
6 create: MyApp.FileAction.Create,
7 read: MyApp.FileAction.Load,
8 update: MyApp.FileAction.Update,
9 destroy: MyApp.FileAction.Destroy
10 },
11 writer: new Ext.data.JsonWriter({
12 encode: false,
13 writeAllFields: true
14 }),
15 idProperty: 'id',
16 totalProperty: 'total',
17 root: 'data',
18 sorters: [{
19 property: 'datetimeCreated',
20 direction: 'DESC'
21 }],
22 fields: ['title', 'classId',{
23 name: 'datetimeCreated',
24 mapping: 'datetimeCreated',
25 type: 'date',
26 dateFormat: 'timestamp'
27 }, 'docAbstract','typeId']
28 });
注意里面的sorters是MixedCollection类型,可以写多个(用于支持多排序)
测试通过,跟踪一下firebug看看,post过去的是这个:
貌似也是MixedCollection类型,后台通过Dictionary<string, object>接受,最终调试成功的代码为:
1 [DirectMethod]
2 public FileInfoSerializer Load(Dictionary<string,object> arg)
3 {
4 object[] sorters = (object[])arg["sort"];
5 Dictionary<string, object> sorter = (Dictionary<string, object>)sorters[0];
6 FileInfoCollection coll = new FileInfoCollection();
7 coll.OrderField = sorter["property"].ToString();
8 coll.OrderDirection = sorter["direction"].ToString().ToLower() == "desc" ? FileInfoCollection.Direction.DESC : FileInfoCollection.Direction.ASC;
9 return new FileInfoSerializer(coll);
10 }
可以通过object[]数组提取各个排序信息,也可以提取start、page、limit参数用于分页。
继续研究Ext4,变化真的不小。