Ext.data.proxy.Proxy 代理类的根类

客户端代理:

1.LocalStorageProxy:将数据存储在localStorage中,此种方式可以持久的将数据存储在客户端

要使用代理,我们首先要有一个数据模型类,我们定义一个简单的Person类:

Ext.define('Person', {extend: 'Ext.data.Model',     fields: ['name', 'age']});

有了Model,我们还需要一个Store。我们可以把 Store 理解为数据仓库, 它对应数据库中的表,而Store 包含的 Record 则是数据表中的每一行记 录。我们同样简单的创建一个Store对象:

var personStore = Ext.create("Ext.data.Store", {     model: 'Person'});

接下来就到我们代理出场的时候了。我们需要创建一个LocalStorageProxy:

var personProxy = new Ext.data.proxy.LocalStorage({     id: 'Person_LocalStorage', model: 'Person'});

将代理和Store 联系在一起

personStore.setProxy(personProxy);

际应用中,可以在Model 或 Store 中直接使用proxy 选项,

我们在后面的示例中将会看到具体的用法。

personStore.add({ name: 'www.qeefee.com', age: 1 });   personStore.add({ name: 'qf', age: 26 });   personStore.add({ name: 'qifei', age: 26 });   personStore.sync();

要查看保存的数据,我们需要先将数据从LocalStorage中加载到Store 中,

然后对Store 进行遍历:

personStore.load();

var msg = [];

personStore.each(function (person) {    msg.push(person.get('name') ' '                        person.get('age'));

});

Ext.MessageBox.alert('提示', msg.join('<br />'));

使用load方法会将所有的数据都加载到Store中,如果我们需要进

行查询指定的数据,就要用到filter方法了

personStore.filter("name", /\.com$/);

使用多个过滤条件:

personStore.filter([

{ property: "name", value: /\.com$/ },

{ filterFn: function (item) { return item.get("age") > 10; } } ]);

使用过滤条件代替过滤方法

personStore.filter(function (item) {

return item.get("age") > 10 && item.get('name').length     > 3;});

更新操作:

//得到第一个person对象

var person = personStore.first();

//修改名字字段

person.set('name', 'qeefee.com');

//保存到本地

personStore.sync();

删除操作:

//得到第一个person对象

var person = personStore.first();

//移除

personStore.remove(person);

//保存

personStore.sync();

2.SessionStorageProxy:将数据存储在sessionStorage中,

此种方式只在当前会话中生效,当关闭浏览器以后,数据也会随之丢失。

用法与LocalStorageProxy 的用法基本一致,我们这次在Model中添加 proxy 的配置项

//定义数据模型

Ext.define('Person', {extend: 'Ext.data.Model',     fields: ['name', 'age'], proxy: {type: 'sessionstorage',

id: 'myProxyKey' }});

在Model中加入代理配置以后,我们就不需要单独的定义代理对象了,

可以直接使用Store来对其进行操作

//定义Store

var personStore = Ext.create("Ext.data.Store", {     model: 'Person'});

//添加数据

personStore.add({name:'www.baidu.com',age:1});    personStore.add({name:'qf',age:26 });

personStore.add({name:'qifei',age: 26 });

personStore.sync();

//读取数据

personStore.load();

Var  msg=[];

personStore.each(function(person){     msg.push(person.get('name') ' ' person.get('age'));

});

Ext.MessageBox.alert('提示', msg.join('<br />'));

3.MemoryProxy:将数据存储在内存中,此种方式只在当前页面有效,

且如果刷新页面,数据将丢失。

//定义数据模型

Ext.define('Person', { extend: 'Ext.data.Model',

fields: ['name', 'age']});

var data = {Users: [{ name: 'www.baidu.com', age: 1 },

{ name: 'qeefee', age: 1 }]}

//定义Store

var personStore = Ext.create("Ext.data.Store", {

model: 'Person',

data: data.Users, proxy: {type: 'memory'}});

在代码中高亮显示的部分,就是为store设置的缓存。当personStore 定义的时候,它就会自动的将数据加载到Store中,所以在我们访问数据的时候不需要再调用load方法了:

//读取数据

Var msg=[];

personStore.each(function(person) {

msg.push(person.get('name') '

' person.get('age'));});

Ext.MessageBox.alert('提示', msg.join('<br />'));

和上两个的操作基本一致,我们可以通过下面的代码添加一行新数据:

personStore.add({ name: 'qifei', age: 26 });

personStore.sync();

服务端代理模式有:

Ajax : 在当前域中发送请求。

JsonP:  跨域的请求。

Rest :   与服务器进行RESTful(GET/PUT/POST/DELETE)交互

Direct: 使用 Ext.direct.Manager 发送请求。

常用的代理模式Ajax

示例:

Ext.onReady(function(){

Ext.define('Person',{extend: 'Ext.data.Model',

fields: ['name', 'age']

});

var store= Ext.create('Ext.data.Store',

{model:'Person',

proxy: {

type: 'ajax',

url: rootUrl 'sample/getjson',

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

});

store.load();

var msg = [];

store.each(function(person){

msg.push(person.get('name') '' person.get('age'));

});

Ext.MessageBox.alert('提示', msg.join('<br />')); });

在这段代码中,首先定义了Model类Person,然后创建了Person类的数据仓库 store,store 使用了ajax代理,通过url向服务器请求数据,ajax代理的reader 配置项是告诉程序以何种方式读取请求到的数据。

服务器返回的JSON 字符串如下:

{users:[{name:'www.baidu.com', age:1}, {name:'Tom', age:26}]}

如果你打开网络跟踪,会发现程序已经将成功得到了这段JSON字符串。那是为什么仍然是空呢?

原因是当我们调用load()方法的时候,我们告诉store去请求数据吧,然后store就使用ajax的方式请求url,注意,ajax 是异步的,所以当我们调用load()方法以后,马上执行输出的时候,store仍然是空的,可能它还在等待服务器响应数据。

所以,在我们使用ajax方式加载数据的时候,就需要为load() 方法添加一个callback 方法,当数据加载完成以后,再callback方法中进行数据输出,修改load方法的调用:

store.load({

callback:function(records,operation,success){

if(success){varmsg=[];store.each(

function(person){

msg.push(person.get('name') ' ' person.get('age'));

});

Ext.MessageBox.alert('提示', msg.join('<br />'));}}

});

在使用ajax进行请求的时候,ajax代理会调用自身的read方法,该方法的第一个参数是Ext.data.Operation 类型,它用来配置我们如何进行请求。我们在load 方法中可以通过配置项传递一些参数,load在调用read方法时将这些参数传递过去,read则会根据这些参数生成Ext.data.Operation 的一个实例。所以,我们可以这样来传递参数

store.load({

page: 2,

limit:10,params:{name:'QF'},

callback:function(records,operation,success){

if(success){varmsg=[];store.each(function(person) {msg.push(person.get('name') ' ' person.get('age'));

});

Ext.MessageBox.alert('提示', msg.join('<br />')); }}});

/SampleExtJS/sample/getjson?_dc=1374141754304&name=QF&pag e=2&start=25&limit=10

通过传递这些参数,我们可以完成分页、查询等操作。

JsonP

在ExtJS 中我们可以轻松的使用JsonP代理进行跨域的数据请求:

//创建Store

var store = Ext.create('Ext.data.Store', {model: 'Person',     proxy: {

type: 'jsonp',

url: 'http://www.abc.com/sampleextjs/sample/getjsonp',

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

});

务器返回的字符串为:

Ext.data.JsonP.callback1({

users: [{ name: 'www.baidu.com', age: 1 },

{ name: 'QF', age: 26 }]

})

Direct 代码使用Ext.Direct 向服务器发动数据。

Ext.Direct 技术的好处是,允许你像调用Javascript 方法一样调用服务器端代码

Ext.define('User', {

extend: 'Ext.data.Model',

fields: ['firstName', 'lastName'],

proxy: { type: 'direct', directFn: MyApp.getUsers, paramOrder: 'id' }

});

User.load(1);

参考:http://www.qeefee.com/extjs-course-6-server-proxy

    demo 下载 https://github.com/ningmengxs/Extjs.git

更多专业前端知识,请上 【猿2048】www.mk2048.com

Extjs 数据代理相关推荐

  1. get vue 和set 用法_深入剖析Vue源码 - 数据代理,关联子父组件

    简单回顾一下这个系列的前两节,前两节花了大篇幅讲了vue在初始化时进行的选项合并.选项配置是vue实例化的第一步,针对不同类型的选项,vue提供的丰富选项配置策略以保证用户可以使用不同丰富的配置选项. ...

  2. 流媒体数据代理----Anychat

    "用户流媒体数据代理功能",使用该功能可以实现指定用户将其它用户的流媒体数据(音频.视频)做为自己的数据,转发给请求指定用户相关数据的用户. 应用场景:将指定用户(P)设置为其它用 ...

  3. data 的数据代理

    一.Object.defineProperty() 控制对象的属性值 let num = 18; let person = {name: 'mary',age: num; };Object.defin ...

  4. Vue数据代理与数据监测

    一.数据代理 1.什么是数据代理? 数据代理:通过一个对象代理对另一个对象中属性的操作 2.Vue数据代理 通过vm对象来代理配置对象data中所有属性的操作. (如果想访问data里的数据,可以直接 ...

  5. 【Vue2.0】—数据代理(一)

    [Vue2.0]-数据代理(一) Vue 的数据代理:通过VM对象来代理data对象中属性的操作(读/写) Vue 中数据代理的好处:更加方便的操作data中的数据 基本原理: 通过Object.de ...

  6. vue2知识点:数据代理

    文章目录 一.何为数据代理 二.vue中的数据代理 三.回顾Object.defineProperty() 本人其他相关文章链接 一.何为数据代理 数据代理:通过一个对象代理对另一个对象中属性的操作( ...

  7. 【精讲】vue数据绑定、数据内容的应用、数据结构、数据代理

    目录 简介 vue数据绑定 数据内容的应用 数据结构 数据代理 知识点拓展 简介 vue是一款实用的框架,他可以大大提高我们编写项目的速度.在之前的板块中,我们聊过vue框架的实用性,在这一板块,我们 ...

  8. vue面试核心,双向数据绑定,数据代理,数据劫持,发布订阅,数据编译,看这个demo就够了

    vue面试核心,双向数据绑定,数据代理,数据劫持,发布订阅,数据编译,看这个demo就够了. 不在怕面试官,你给我怼过去.复制到html文档,浏览器运行即可. mvvm原理剖析 {{singer}}

  9. 从零学习Vue - 02模板语法、el与data两种写法、mvvm模型、数据代理

    root容器里的代码被称为模板,有了模板会有特殊的模板语法.Vue模板中语法有两大类,一类是插值语法,另一类是指令语法. 插值语法 功能:用于解析标签体内容.写法:{{xxx}},xxx为js表达式, ...

最新文章

  1. 有这么一群人,他们通过AI撬动世界!
  2. 利用SETFACL来设置文件或文件夹的访问控制列表ACL
  3. 加密软件漏洞评测系统_所有雷电接口电脑5分钟内即可破解,漏洞无法软件修复,微软Surface笑了...
  4. 【OpenCV3】级联分类器目标检测——cv::CascadeClassifier简介
  5. lucene 多个分词查找_使用Lucene的新FreeTextSuggester查找长尾建议
  6. 咖啡网页设计作品 简单DIV学生网页设计成品 HTML网页学生网页制作模板下载
  7. C#获取周一、周日的日期 函数类
  8. 201671010139 徐楠 关于Java的一些体验
  9. Using the isBranch() method to determine if a Tree item is a branch or leaf
  10. Shiro 的 HelloWorld
  11. mysql修改表、字段、库的字符集
  12. mysql数据库博客源码下载_个人博客搭建(含源码,数据库文件下载)(前端HTML+CSS+JS 后台PHP+Mysql)...
  13. 分享一种很好看的字体
  14. 实验5 Spark SQL 编程初级实践
  15. 我希望进入大学时就能知道的一些事儿
  16. 添加滑条进行图像叠加
  17. 状态模式、有限状态机 Unity版本实现
  18. Arrays.aslist新建的list集合不能add()、remove()你知道吗?
  19. 光纤:光纤和光纤布线
  20. 学人工智能好就业吗?可以做什么?AI就业方向及前景

热门文章

  1. 自适应滤波实例之噪声抵消
  2. 约束,MySQL约束,非空默认值,主键外键唯一自增,完整详细可收藏
  3. java圆形排列_位图排序java版
  4. 有没有查计算机组成的答案得,计算机组成答案.doc
  5. html5块元素代码,html5 区块与内联div 与span html块级元素(示例代码)
  6. oracle中时间加减一年的写法
  7. [Java开发]打印当前路径到控制台
  8. DataURL与File,Blob,canvas对象之间的互相转换的Javascript (未完)
  9. python函数的 全局变量与局部变量
  10. Android studio Error occurred during initialization of VM 问题解决