原文:Declarative Listeners in Ext JS 5

在前文《在Ext JS 5使用ViewControllers》中,简单的介绍了Ext JS 5的一项重要改进——声明式事件监听。在本文,将深度探讨如何使用声明式事件监听啦简化应用程序的视图并减少自定义组件的样板代码。

注意:文章假设你使用的是Ext JS 5.0.1或更高版本。

什么是声明式事件监听?

所谓的“声明式事件监听”,就是指定义在类主体中的监听或在实例的配置对象中使用了listeners配置项。以这种方式来声明事件监听不是Ext JS 5的新功能。在Ext JS 4,可以正在类中声明事件监听,不过只适于处理函数或作用域已定义的情况,例如:

    Ext.define('MyApp.view.User', {extend: 'Ext.panel.Panel',listeners: {// 函数必须内联或在之前已被定义:collapse: function() {// respond to panel collapse here}},//该方法不能被定义为collapse的处理函数:onCollapse: function() {}});

由于所需的处理函数不能使用类中定义的方法,因而声明式监听在Ext JS 4中的使用有限。开发人员通常会通过重写initComponent方法并使用on方法来添加监听:

    Ext.define('MyApp.view.User', {extend: 'Ext.panel.Panel',initComponent: function() {this.callParent();this.on({collapse: this.onCollapse,scope: this});},onCollapse: function() {console.log(this); // the panel instance}});

作用域解析

在Ext JS 5,对listeners配置项做了改进,允许将事件处理指定为字符串来对应方法名。在运行时(触发事件的任何时候),框架会将这些方面解析为实际的函数引用。我们将这一过程称为事件监听作用域解析。

在Ext JS 4,如果明确给出了“作用域”,才能解析字符串处理程序。而在Ext JS 5,在声明“字符串”处理程序而没有明确声明作用域的时候,为默认作用域解析添加了一些特殊规则。

作用域解析有两种结果:组件或视图控制器(ViewController)。无论是哪种结果,都会从组件开始搜索。作用域可能是组件,也可能是视图控制器,如果不是,框架会“爬”到组件的上层直到找到适合的组件或视图控制器。

解析作用域为组件

框架解析作用域的第一种方式是寻找defaultListenerScope配置项为true的组件。对于类中的事件监听声明,搜索会从组件自身开始。

    Ext.define('MyApp.view.user.User', {extend: 'Ext.panel.Panel',xtype: 'user',defaultListenerScope: true,listeners: {save: 'onUserSave'},onUserSave: function() {console.log('user saved');}});

监听被定义在了用户视图的类主体,这意味着框架在提升层次之前会先检查用户视图自身的defaultListenerScope。在当前示例,用户视图将defaultListenerScope设置为了true,那当前监听的作用域将会被解析为用户视图。

对于事件监听被声明在实例配置项的情况,将会条过组件自身,框架会从父容器开始搜索,请参考以下代码:

    Ext.define('MyApp.view.main.Main', {extend: 'Ext.container.Container',defaultListenerScope: true,items: [{xtype: 'user',listeners: {remove: 'onUserRemove'}}],onUserRemove: function() {console.log('user removed');}});

对于用户视图的监听是在实例的配置对象中声明的,这意味着框架会跳过用户视图(尽管它定义了defaultListenerScope为true),且会解析为主视图。

解析作用域为视图控制器

在Ext JS 5,引入了新的控制器类型——Ext.app.ViewController。在《在Ext JS 5使用ViewControllers》中详细介绍了视图控制器,因此这里只讨论与视图控制器与事件监听有关的部分。

与Ext.app.Controller可以管理许多视图不同,每一个视图控制器实例只能绑定一个视图实例。视图与视图控制器之间之间一对一的关系允许视图控制器作为视图或视图的条目中事件监听声明的默认作用域。

对于defaultListenerScope,规则同样适用于视图控制器。类层的监听总是会在搜索组件的上层之前先搜索组件自身的视图控制器。

    Ext.define('MyApp.view.user.User', {extend: 'Ext.panel.Panel',controller: 'user',xtype: 'user',listeners: {save: 'onUserSave'}});Ext.define('MyApp.view.user.UserController', {extend: 'Ext.app.ViewController',alias: 'controller.user',onUserSave: function() {console.log('user saved');}});

上述监听被声明在用户视图的类主体内,由于用户视图有它自己的控制器,框架会解析作用域为UserController。如果用户视图没有自己的控制器,那么作用域会解析到上层。

另一方面,实例层监听会跳过组件并解析为视图控制器上层的父容器,例如:

    Ext.define('MyApp.view.main.Main', {extend: 'Ext.container.Container',controller: 'main',items: [{xtype: 'user',listeners: {remove: 'onUserRemove'}}]});Ext.define('MyApp.view.main.MainController', {extend: 'Ext.app.ViewController',alias: 'controller.main',onUserRemove: function() {console.log('user removed');}});

合并listeners配置项

在Ext JS 4,在基类声明的监听会被子类或实例的listeners配置项的声明完全重写。在Ext JS 5,改进了listeners的API,可适当的合并在基类、子类和实例中的事件监听声明。要想了解其中的行为,可查看以下示例:

    Ext.define('BaseClass', {extend: 'Ext.Component',listeners: {foo: function() {console.log('foo fired');}}});Ext.define('SubClass', {extend: 'BaseClass',listeners: {bar: function() {console.log('bar fired');}}});var instance = new SubClass({listeners: {baz: function() {console.log('baz fired');}}});instance.fireEvent('foo');instance.fireEvent('bar');instance.fireEvent('baz');

在Ext JS 4,上面示例只会输出“baz”,但在Ext JS 5,listeners配置项会被正确的合并并输出“foo bar baz”。这就允许类在需要的时候才去声明监听而不需要知道超类是否已经有了监听。

小结

我们任务声明式的监听可大大简化应用程序中的事件监听定义。结合视图控制器用于处理应用程序的逻辑和视图模型的双向绑定,还可以尽可能的改进应用程序的开发体验。尝试去让我们知道你的想法。

作者:Phil Guerrant
Phil is a Sencha software engineer who works on Ext JS. He has over 10 years of experience as a developer and specializes in HTML5 and web development, UI, and agile methodologies.

转载于:https://www.cnblogs.com/muyuge/p/6333655.html

Ext JS 5的声明式事件监听相关推荐

  1. JS:鼠标移入移出事件监听

    <!DOCTYPE html> <html lang="en" dir="ltr"><head><meta chars ...

  2. js 监听 安卓事件_百行代码实现js事件监听实现跨页面数据传输

    百行代码实现js事件监听实现跨页面数据传输 使用场景 类似消息队列的使用场景,支持同页面和跨页面通信,发送消息和接收消息 技术原理 跨页面通信: 基于事件监听,通过监听 storage事件监听回调机制 ...

  3. chromedp网络监听_动态爬虫三:监听网络事件 + 监听js事件

    一: 概述 上两篇文章介绍了cdp协议和chromedp库,从这篇文章开始动手实战一下,我们要拿到页面上更多的网络请求,最直接的想法就是类似于开发者工具里的network,只有一有网络请求就显示在列表 ...

  4. js如何监听元素事件是否被移除_JS移除事件监听的方法 .removeEventListener( )

    JS用addEventListener添加事件监听方法后,可以用removeEventListener来解除监听: element.removeEventListener(event, myFunct ...

  5. 理解JS中的声明式与命令式

    理解JS中的声明式与命令式? 声明式编程 :告诉机器你想要的是什么    让机器想出去做 优缺点 : 声明式减少了可变量(Immutable Variable)的声明,程序更为安全,   代码更加简洁 ...

  6. html中事件监听的使用,Vue.JS入门篇--事件监听

    你可以使用 v-on 指令来绑定并监听 DOM 事件.绑定的内容可以是一个当前实例上的方法 (后面无需跟括号) 或一个内联表达式.如果提供的是一个方法,则原生的 DOM event 会被作为第一个参数 ...

  7. JS事件汇总,addEventListener添加事件监听

    JS事件汇总 JavaScript 事件 JS事件汇总 鼠标事件 键盘事件 表单事件 读取事件 onload与onpageshow事件区别 其它事件 addEventListener()添加事件监听 ...

  8. html js按钮事件监听,JS监听事件

    对象 - JS监听事件 ¶ 作者:KK 发表日期:2016.2.21 在准备讲解后面的window对象之前,这里将话题转回来事件这里 平时咱们在一个元素里加个onclick属性,属性值写JS代码,这样 ...

  9. JS的事件监听与委托机制

    JS的事件监听机制 小故事: 很久以前有个叫Netscape的姑娘,她制订了Javascript的一套事件驱动机制(即事件捕获) 后来又有一个叫"IE"的小子,这孩子比较傲气,他认 ...

最新文章

  1. 线程安全: 互斥锁和自旋锁(10种)
  2. 小程序支持php版本是多少,小程序体验版本什么意思
  3. 最强蜗牛击败毁灭机器人_最强蜗牛:恶魔形态解锁攻略
  4. python实现单链表快速排序升序linkedqueue_LeetCode 总结 - 搞定 Linked List 面试题
  5. Struts1和Struts2的特点、工作流程及差异性
  6. mfc 子窗体 按钮不触发_PIE二次开发在子窗体中选择主窗体中的文件
  7. 单片机控制步进电机程序c语言正反转停止,51单片机控制步进电机的启动、停止、正转、反转...
  8. 电商项目——商品分类/品牌查询
  9. 世界读书日,给大家推荐几本书
  10. 那些便宜的vps,你敢用吗?企业该如何选择云服务器?
  11. Jitsi的公网部署与SSL证书手动安装
  12. Vivado 与 Vitis 2022.1 安装记录
  13. BHEX创始人巨建华鲲鹏会分享:创业路上从不孤单
  14. 用python分析四大名著(一)
  15. 网站漂浮广告代码收藏
  16. 2组语法,1个函数,教你学会用Python做数据分析!
  17. ccf论文分级_论文等级如何划分
  18. pencv 二值图像的孔洞填充
  19. cv2 读取、显示、保存图片
  20. 由于找不到opencv_world310d.dll,无法继续执行代码。重新安装程序可能会解决此问题。

热门文章

  1. Spring ROO初体验
  2. 浅谈Android binder原理与设计 (1)
  3. python eval 字符串替换_Python中eval妙用,字符串转字典和列表
  4. @scheduled 每30s 执行一次_荣耀30S正式发布:麒麟820 5G SoC/6400万像素AI四摄/40W超级快充...
  5. Spring学习之旅(四):面向切面编程(AOP)
  6. mobilenet V1
  7. 七阶拉丁方阵_【C语言】输出N阶拉丁方阵并统计个数
  8. 一个进程在执行过程中可以被中断事件打断_Linux操作系统:中断类型和中断的作用...
  9. 重庆科技学院c语言程序设计报告,2020年重庆科技学院《911程序设计综合》硕士研究生招生复试大纲...
  10. php 2010excel,PHPExcel在php5.2.10上的bug