转载自起飞网,原文地址:http://www.qeefee.com/extjs-course-7-Ext-Direct

  • ExtJS 4.2 教程-01:Hello ExtJS
  • ExtJS 4.2 教程-02:bootstrap.js 工作方式
  • ExtJS 4.2 教程-03:使用Ext.define自定义类
  • ExtJS 4.2 教程-04:数据模型
  • ExtJS 4.2 教程-05:客户端代理(proxy)
  • ExtJS 4.2 教程-06:服务器代理(proxy)
  • ExtJS 4.2 教程-07:Ext.Direct

在上一节中,我们介绍了ExtJS 中的服务器段数据代理,在介绍到Direct 代理的时候,我们提到了Ext.Direct。这一节我们将重点介绍Ext.Direct的具体用法,并对上一节中Direct代理进行补充。

Ext.Direct 提供了一种使用Javascript 调用服务器端方法的机制,它与服务器端技术无关,因此可以在php、java、.net 等众多平台中使用该技术。

我们本节中将以RemotingProvider 为例进行讲解。对于RemotingProvider 的执行流程,大致上是:定义API,并将API添加到Ext.direct.Manager,然后我们将通过调用API来执行远程请求。请求过程中,ExtJS 将创建一个Ajax 请求,将Remoting有关的数据发送到服务器的Remoter页面,Remoter将对其进行分流,根据action(对应类名)、method(对应方法名)调用不同的方法,完成执行调用后,将封装好的结果返回给客户端。

API 和 Router

在使用Ext.Direct的时候,我们需要将后台的类、方法等封装成API的形式,然后在Ext.direct.Manager 中进行注册。

通常情况下,API 可以由程序根据配置项生成,所谓的生成,无非是根据配置项生成可执行的Javascript代码,并以<script>标签的形式引入到页面中。我们今天将采用直接定义的方式来完成。代码如下:

var userAPI = Ext.create('Ext.direct.RemotingProvider', {url: rootUrl + 'DirectAPI/Router',actions: {User: [{name: 'GetUserList',len: 0},{name: 'GetUser',params: ['name']}]}
});

userAPI 提供了两个操作,分别是GetUserList 和GetUser,他们都数据类 User。url 指向了DirectAPI/Router,此时我们需要在程序中添加DirectAPIController,然后在里面定义三个方法,代码如下:

public class DirectAPIController : Controller
{public static List<User> UserList = null;static DirectAPIController(){if (UserList == null){UserList = new List<User>();UserList.Add(new User() { name = "www.qeefee.com", age = 1 });UserList.Add(new User() { name = "QF", age = 26 });}}//// GET: /DirectAPI/[HttpPost]public JsonResult Router(FormCollection collection){Stream input = Request.InputStream;input.Seek(0, SeekOrigin.Begin);byte[] buffer = new byte[input.Length];Request.InputStream.Read(buffer, 0, (int)input.Length);string inputString = Encoding.UTF8.GetString(buffer);dynamic json = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(inputString);ExtResult result = new ExtResult();result.tid = json.tid;result.action = json.action;result.method = json.method;result.type = json.type;string method = json.method;switch (method){case "GetUserList":{result.result = GetUserList();}break;case "GetUser":{string name = json.data.name;result.result = GetUser(name);}break;}return Json(result);}public List<User> GetUserList(){return UserList;}public User GetUser(string name){return UserList.Find(m => m.name == name);}}

代码有点长了不好意思!主要的代码在Router方法中,在读取数据的时候,我使用Request 无法获取到,无奈之下只能读取InputStream,有知道为什么不能读取Request 的朋友还望告知。

在方法中先将客户端传递的POST数据进行读取,然后转换为Json字符串。在转换完成后根据method路由分配,将得到的结果传递给客户端。

这里对返回的数据进行了封装,ExtResult 类代码如下:

public class ExtResult
{public string action { get; set; }public string method { get; set; }public int tid { get; set; }public string type { get; set; }public object result { get; set; }
}

客户端调用

有了我们前面定义的API,我们可以方便的使用定义好的方法:

User.GetUserList(function (result, event, success, options) {var msg = [];Ext.Array.each(result, function (item) {msg.push(item.name + "  " + item.age);});Ext.MessageBox.alert('提示', msg.join('<br />'));
});

我们把之前定义的User 作为静态类,GetUserList 是它的一个静态方法,我们可以像C#一样调用后台的方法。

除了直接调用之外,我们可以结合上节课中介绍的DirectProxy 来使用:

//创建Store
var store = Ext.create('Ext.data.Store', {model: 'Person',proxy: {type: 'direct',directFn: User.GetUserList,reader: {type: 'json'}}
});//加载store
store.load({callback: function (records, operation, success) {var msg = [];store.each(function (item) {msg.push(item.get('name') + '   ' + item.get('age'));});Ext.MessageBox.alert('提示', msg.join('<br />'));}
});

参数传递

Ext.Direct 支持两种参数传递形式:匿名参数和命名参数。

匿名参数是在Ext.Direct 推出以后就支持的,它不指定参数的名称,只指定参数个数,在调用的时候将参数作为一个字符串数组传递给后台。例如,我们为User 新增一个方法 GetUserByName,它需要一个name参数,我们此处使用匿名参数的形式:

{name: 'GetUserByName',len: 1
}

在调用的时候,将参数写在回调方法之前:

User.GetUserByName('QF', callback);

如果使用匿名参数,则有多少个参数就在callback之前写多少个参数,最终这些参数会作为data的一部分传递给服务器。

命名参数则是Ext 4.2中新增的,它允许在定义的时候指定参数的名称,然后在调用的时候使用JSON的格式传递参数,例如我们之前定义的GetUser 方法,它有一个name参数:

{name: 'GetUser',params: ['name']
}

在调用的时候,我们需要使用JSON格式的数据,指定参数名称对应的值:

User.GetUser({ name: 'QF' }, callback);

此时传递给服务器的数据形式如下:

消息订阅

Ext.Direct 为我们提供了方便的消息订阅机制。如果我们要订阅名称为“message”的消息,可以使用下面的代码完成:

Ext.direct.Manager.on('message', function (e) {Ext.MessageBox.alert('提示', e.result);
});

此时,如果服务器返回的数据,type为event,name为message,则会弹出提示。服务器返回的数据:

轮询 - PollingProvider

Ext.Direct 还提供了轮询的方式,它会在指定时间段重复对数据库的请求操作。

var polling = Ext.create('Ext.direct.PollingProvider', {url: rootUrl + 'DirectAPI/GetMessage',type: 'polling',interval: 5000,listeners: {data: function (provider, e, eOpts) {Ext.MessageBox.alert('', e.data.msg);}},id: 'GetMessagePolling'
});
//启动连接
polling.connect();

PollingProvider 会定时请求url,当得到服务器响应的数据后,触发data事件。

polling.connect() 方法会启动连接,如果要关闭连接,则使用polling.disconnect()

转载于:https://www.cnblogs.com/youring2/p/3282301.html

ExtJS 4.2 教程-07:Ext.Direct相关推荐

  1. ExtJS 4.2 教程-08:布局系统详解

    ExtJS 4.2 系列教程导航目录: ExtJS 4.2 教程-01:Hello ExtJS ExtJS 4.2 教程-02:bootstrap.js 工作方式 ExtJS 4.2 教程-03:使用 ...

  2. ExtJS 4.2 教程-01:Hello ExtJS

    本文转载自: https://www.cnblogs.com/youring2/p/3269503.html 作者:youring2 转载请注明该声明. 转载自起飞网,原文地址:http://www. ...

  3. ext ext.ajax_在Ajax应用程序中使用Ext.Direct

    ext ext.ajax Ajax的概念使Web应用程序可以从缓慢,无响应和违反直觉的方式发展为类似于桌面应用程序的行为,提供即时反馈,消除页面刷新的需求并促进更好的用户体验. Ajax的问题​​在于 ...

  4. 官网的Ext direct包中.NET版的问题

    下载了官网的 Ext direct 包进行研究,发现服务器端返回结果存在一点小问题.主要问题在返回的结果 result 标记对应的数据是字符串,请看以下官方例子中返回的数据: {"type& ...

  5. 《Ext JS高级程序设计》节选:在CRUD操作中restful的设置以及使用Ext.Direct的问题...

    在上一节的示例中,也可以在 Store 或 HttpProxy 中定义参数 restful 实现 RESTful 操作,不过在使用 RESTful 操作之前,先要了解清楚你所使用的服务器端语言是否支持 ...

  6. 【OpenCV DNN】Flask 视频监控目标检测教程 07

    欢迎关注『OpenCV DNN @ Youcans』系列,持续更新中 [OpenCV DNN]Flask 视频监控目标检测教程 07 3.7 OpenCV+Flask实时监控人脸识别 cvFlask0 ...

  7. ExtJs 备忘录(9)—— Ext常用属性、方法小结 [系列完]

    一.Ext 1.1 Ext.isEmpty(v, allowBlank) //是否为空[链接] 1.2 Ext.isArray(v) //是否为数组集合 1.3 Ext.isPrimitive(v) ...

  8. extlink.php,ExtJs 学习笔记基础篇 Ext组件的使用_extjs

    昨天刚接触到Extjs,简单写了篇学习笔记,今天继续. 天介绍一下Ext中组件举几个简单的例子做说明.注意:文章内容有些摘自本人学习过程中看到的资料. Ext2.0对框架进行了非常大的重构,其中最重要 ...

  9. extJs 2.0学习笔记(Ext.Panel篇四)

    我刚才禁不住诱惑去看了一下Ext.Window的API文档,发现只是比Panel多了点什么最大化.最小化.关闭.置前.置后.动画引发目标设置.可调整大小这些功能.像什么标题栏.工具栏之类的东西在Ext ...

最新文章

  1. 改變人生的21種好習慣
  2. 实现简单递归c++实现
  3. CTF(Pwn)32位文件 和 64 文件 的 差异
  4. java 释放指针_C库释放来自Rust的指针
  5. 我的软考之路——软考心得
  6. 在.NET Core程序中设置全局异常处理
  7. 全网最细之接口的定义与实现
  8. 为什么脚本执行一行就不动了_在Linux中通过expect工具实现脚本的自动交互
  9. JS+CSS打造随屏幕滚动的quick快速导航代码
  10. java大致了解_学习Java第一天,大致了解
  11. git推送项目到码云(gitee)
  12. Android Gradle Task-中文
  13. 01219 oracle,ORA-01219: 数据库或可插入数据库未打开: 仅允许在固定表或视图中查询 oracle...
  14. SpringMVC的拦截器Inceptor
  15. 学习后台第二周(ง •_•)ง
  16. Vmware中桥接无法获取IP
  17. python入门经典书书籍-python入门到进阶书籍推荐!16本经典python书籍
  18. 量子计算机采用超导技术吗,新发现的超导体材料可能是量子计算机的硅
  19. Echarts-----map(单独省级地图)
  20. python : pandas 中多重索引multiindex与多个标的dataframe

热门文章

  1. 设计模式学习---单件模式
  2. LNG:首个基于图的对抗样本检测方法
  3. 第四届UG2研讨会和竞赛:弥合计算成像与视觉识别之间的鸿沟
  4. 一图胜千言,这本交互式线代教科书让你分分钟理解复杂概念,佐治亚理工出品...
  5. 666! 玩王者,识英雄,这样也能上顶会!
  6. CV Code | 计算机视觉开源周报 20190701期
  7. 【Java进阶营】Java多线程基础学习(一)
  8. 卷积神经网络CNN是靠什么线索学习到深度信息的?
  9. 收藏!38所设有人工智能学院高校表单!
  10. DataFountain新上两项CV算法竞赛(文化传承——汉字书法多场景识别、大数据医疗——肝癌影像AI诊断)——50万巨奖等你来拿!