在上一节中,我们介绍了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>标签的形式引入到页面中。我们今天将采用直接定义的方式来完成。代码如下:

  1. var userAPI = Ext.create('Ext.direct.RemotingProvider', {
  2. url: rootUrl + 'DirectAPI/Router',
  3. actions: {
  4. User: [
  5. {
  6. name: 'GetUserList',
  7. len: 0
  8. },
  9. {
  10. name: 'GetUser',
  11. params: ['name']
  12. }
  13. ]
  14. }
  15. });

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

  1. public class DirectAPIController : Controller
  2. {
  3. public static List<User> UserList = null;
  4.  
  5. static DirectAPIController()
  6. {
  7. if (UserList == null)
  8. {
  9. UserList = new List<User>();
  10. UserList.Add(new User() { name = "www.qeefee.com", age = 1 });
  11. UserList.Add(new User() { name = "QF", age = 26 });
  12. }
  13. }
  14.  
  15. //
  16. // GET: /DirectAPI/
  17. [HttpPost]
  18. public JsonResult Router(FormCollection collection)
  19. {
  20. Stream input = Request.InputStream;
  21. input.Seek(0, SeekOrigin.Begin);
  22.  
  23. byte[] buffer = new byte[input.Length];
  24.  
  25. Request.InputStream.Read(buffer, 0, (int)input.Length);
  26. string inputString = Encoding.UTF8.GetString(buffer);
  27. dynamic json = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(inputString);
  28.  
  29. ExtResult result = new ExtResult();
  30. result.tid = json.tid;
  31. result.action = json.action;
  32. result.method = json.method;
  33. result.type = json.type;
  34.  
  35. string method = json.method;
  36. switch (method)
  37. {
  38. case "GetUserList":
  39. {
  40. result.result = GetUserList();
  41. }
  42. break;
  43. case "GetUser":
  44. {
  45. string name = json.data.name;
  46. result.result = GetUser(name);
  47. }
  48. break;
  49. }
  50. return Json(result);
  51. }
  52.  
  53. public List<User> GetUserList()
  54. {
  55. return UserList;
  56. }
  57.  
  58. public User GetUser(string name)
  59. {
  60. return UserList.Find(m => m.name == name);
  61. }
  62.  
  63. }

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

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

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

  1. public class ExtResult
  2. {
  3. public string action { get; set; }
  4. public string method { get; set; }
  5. public int tid { get; set; }
  6. public string type { get; set; }
  7. public object result { get; set; }
  8. }

客户端调用

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

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

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

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

  1. //创建Store
  2. var store = Ext.create('Ext.data.Store', {
  3. model: 'Person',
  4. proxy: {
  5. type: 'direct',
  6. directFn: User.GetUserList,
  7. reader: {
  8. type: 'json'
  9. }
  10. }
  11. });
  12.  
  13. //加载store
  14. store.load({
  15. callback: function (records, operation, success) {
  16. var msg = [];
  17. store.each(function (item) {
  18. msg.push(item.get('name') + ' ' + item.get('age'));
  19. });
  20. Ext.MessageBox.alert('提示', msg.join('<br />'));
  21. }
  22. });

参数传递

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

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

  1. {
  2. name: 'GetUserByName',
  3. len: 1
  4. }

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

  1. User.GetUserByName('QF', callback);

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

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

  1. {
  2. name: 'GetUser',
  3. params: ['name']
  4. }

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

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

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

消息订阅

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

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

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

轮询 - PollingProvider

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

  1. var polling = Ext.create('Ext.direct.PollingProvider', {
  2. url: rootUrl + 'DirectAPI/GetMessage',
  3. type: 'polling',
  4. interval: 5000,
  5. listeners: {
  6. data: function (provider, e, eOpts) {
  7. Ext.MessageBox.alert('', e.data.msg);
  8. }
  9. },
  10. id: 'GetMessagePolling'
  11. });
  12. //启动连接
  13. polling.connect();

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

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

ExtJS 4.2 教程-07:Ext.Direct的更多相关文章

  1. ExtJS 4.2 教程-06:服务器代理(proxy)

    转载自起飞网,原文地址:http://www.qeefee.com/extjs-course-6-server-proxy ExtJS 4.2 教程-01:Hello ExtJS ExtJS 4.2 ...

  2. ExtJS 4.2 教程-05:客户端代理(proxy)

    转载自起飞网,原文地址:http://www.qeefee.com/extjs-course-5-client-proxy ExtJS 4.2 教程-01:Hello ExtJS ExtJS 4.2 ...

  3. [译]Vulkan教程(07)物理设备和队列家族

    [译]Vulkan教程(07)物理设备和队列家族 Selecting a physical device 选择一个物理设备 After initializing the Vulkan library ...

  4. 【GStreamer开发】GStreamer播放教程07——自定义playbin2的sink

    目标 通过手动选择音频和视频的sink,playbin2可以进一步定制.这允许使用playbin2的应用在解码后可以自行做最终的渲染和显示.本教程展示了: 如何替换playbin2选择的sink 如何 ...

  5. ExtJS 4.2 教程-03:使用Ext.define自定义类

    转载自起飞网,原文地址:http://www.qeefee.com/extjs-course-3-define-classes ExtJS 4.2 教程-01:Hello ExtJS ExtJS 4. ...

  6. ExtJS 4.2 教程-01:Hello ExtJS

    转载自起飞网,原文地址:http://www.qeefee.com/extjs-course-1-hello-extjs, 本文还发布在了ExtJS教程网站起飞网上面,如果转载请保留本段声明,谢谢合作 ...

  7. 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程07:UI》

    概述: UI即User Interface(用户界面)的简称.UI设计是指对软件的燃机交互.操作逻辑.界面美观的整体设计.好的UI设计不仅可以让游戏变得更有品位,更吸引玩家,还能充分体现开发者对游戏整 ...

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

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

  9. ExtJS 4.2 教程-04:数据模型

    转载自起飞网,原文地址:http://www.qeefee.com/extjs-course-4-data-model ExtJS 4.2 教程-01:Hello ExtJS ExtJS 4.2 教程 ...

随机推荐

  1. IntelliJ IDEA快捷键:Esc

    the Esc key in any tool window moves the focus to the editor. 任何工具窗口都会将焦点移动到编辑器.

  2. Linux系统运维笔记(一),查看系统版本和设置系统时间

    Linux系统运维笔记 查看系统版本和设置系统时间 查看系统版本 lsb_release -a (适用于所有的linux,包括Redhat.SuSE.Debian等发行版,但是在debian下要安装l ...

  3. 前端Datatables自定义事件(监听Datatables插件一些常见的事件动作)

    今天开发项目的时候,用Datatables插件做前端分页列表,想在列表发生翻页.排序.搜索.改变单页显示数据条数这些行为的时候做一些其他的操作,看了半天Datatables官网终于找到可以监测到这些事 ...

  4. Centos7 服务器启动jar包

    首先Centos7 推荐我们这么运行项目 首先执行命令: cd /ets/systemd/system到这个目录下,新建一个 yourProjectName.service,可以把yourProjec ...

  5. canvas入门级小游戏《开关灯》思路讲解

    游戏很简单,10行10列布局,每行每列各10盏灯,游戏初始化时随机点亮其中一些灯,点击某盏灯,其上下左右的灯及本身状态反转,如果点击前是灭着的,点击后即点亮,将所有灯全部点亮才算过关.游戏试玩: 下面 ...

  6. 工程化框架之feather

    feather是一个工程化框架,他的主要任务是框架规范.性能优化.代码部署.自动化.本地调试.多人协同.静态资源管理. 一.安装 因为feather 为npm包,要安装node.js: 如果需要本地调 ...

  7. forof循环

    一.语法 1.遍历数组 let myArr=[1,2,3,4,5]; for (let ele of myArr) { console.log(ele); } let myArr=[1,2,3,4,5 ...

  8. mount: unknown filesystem type 'vboxsf' centos ubuntu 处理方案

    Vagrant was unable to mount VirtualBox shared folders. This is usually because the filesystem " ...

  9. BZOJ2085 : [Poi2010]Hamsters

    设g[i][j]为i串至少加上几个字符后才能包含j,可以通过Hash求出. 然后就是求经过m-1条边的最短路,用倍增加速Floyed即可,时间复杂度$O(n^3\log m)$. #include&l ...

  10. Code Forces 698A Vacations

    题目描述 Vasya has nn days of vacations! So he decided to improve his IT skills and do sport. Vasya know ...