AjaxProxy(Ajax数据代理类)是应用程序中使用最广泛的获取数据的方式. 它使用AJAX请求来从服务器获取数据,然后通常将它们放入 Store中. 例如:
Ext.define('User',{ extend: 'Ext.data.Model',fields: ['id','name','email'] }); //一个包含AjaxProxy代理的Store,使用参数方式绑定. var store = Ext.create('Ext.data.Store',{ model: 'User',proxy: { type: 'ajax',url : 'users.json' } }); store.load();
上面例子中把user数据加载到Store中,首先定义一个Model,Model包含的字段(fields)即为从服务器返回 数据的相应字段. 接下来定义一个Store,它包含了一个proxy配置项. 此配置项将会自动转换为一个 Ext.data.proxy.Ajax类的实例,此实例包含了定义的url参数. 这等效于下面这段代码:
new Ext.data.proxy.Ajax({ url: 'users.json',model: 'User',reader: 'json' });
AjaxProxy可以配置任意类型的Reader来解读服务器端的响应. 如果不显式指定Reader,将默认使用 JsonReader. 可以使用简单属性对象的方式来配置Reader,代理将自动将其转换为Reader类的实例:
var proxy = new Ext.data.proxy.Ajax({ model: 'User',reader: { type: 'xml',root: 'users' } });
AjaxProxy会自动将排序,过滤,翻页和分组参数添加到生成的url中. 可以使用下面这些属性来配置这些参数:
pageParam - 控制如何向服务器发送页数(同样参见startParam和limitParam)
sortParam - 控制如何向服务器发送排序信息
groupParam - 控制如何向服务器发送分组信息
filterParam - 控制如何向服务器发送过滤信息
每个AjaxProxy发出的请求对象由一个Operation对象来描述. 为了说明我们是如何生成自定义url的,例如:
var operation = new Ext.data.Operation({ action: 'read',page : 2 });
然后用此Operation来发布请求,通过调用read:
var proxy = new Ext.data.proxy.Ajax({ url: '/users' }); proxy.read(operation);
Proxy代理类只需要复制Operation中的page值即可. 还能自定义如何向服务器发送page数据:
var proxy = new Ext.data.proxy.Ajax({ url: '/users',pageParam: 'pageNumber' }); proxy.read(operation);
也可以配置Operation来发送start和limit参数代替page:
var operation = new Ext.data.Operation({ action: 'read',start : 50,limit : 25 }); var proxy = new Ext.data.proxy.Ajax({ url: '/users' }); proxy.read(operation);
AjaxProxy还会向服务器发送排序和过滤信息. 例如:
var operation = new Ext.data.Operation({ action: 'read',sorters: [ new Ext.util.Sorter({ property : 'name',direction: 'ASC' }),new Ext.util.Sorter({ property : 'age',direction: 'DESC' }) ],filters: [ new Ext.util.Filter({ property: 'eyeColor',value : 'brown' }) ] });
当使用一个包含sorters和filters参数的Store来加载数据时,就会在内部生成上面这样的对象. 默认情况下,AjaxProxy 会对sorters和filters进行JSON转换,从而得到如下结果(注意url发送前会被加密,这里为便于阅读使用未加密的串):
var proxy = new Ext.data.proxy.Ajax({ url: '/users' }); proxy.read(operation); //GET /users?sort=[{"property":"name","direction":"ASC"},{"property":"age","direction":"DESC"}]&filter;=[{"property":"eyeColor","value":"brown"}]