位置: 编程技术 - 正文

使用AmplifyJS组件配合JavaScript进行编程的指南(amp designer插件)

编辑:rootadmin

推荐整理分享使用AmplifyJS组件配合JavaScript进行编程的指南(amp designer插件),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:amp designer插件,amplitube教程,amplitube教程,amplitube教程,amplitube教程,amplitude怎么用,amplitube教程,amplitude怎么用,内容如对您有帮助,希望把文章链接给更多的朋友!

事件分发的作用

在为页面添加各类交互功能时,我们熟知的最简单的做法就是为页面元素绑定事件,然后在事件处理函数中,做我们想要做的动作。就像这样的代码:

如果我们要做的动作不复杂,那么实际逻辑功能的代码,放在这里是可以的。如果今后需要修改,再到这段事件处理函数的位置来修改。

再进一步,为了做适当的代码复用,我们可能会把逻辑功能中的一部分分拆到一个函数内:

这里的函数doSomethingElse对应的功能可能会在其他地方用到,所以会这样做分拆。此外,可能会有设定坐标这样的功能(假定函数名为setPosition),则还需要用到浏览器事件对象event提供的诸如指针位置一类的信息:

此处有一个不推荐的做法是直接把event对象传递给setPosition。这是因为,分清逻辑功能和事件侦听两种职责,是一种良好的实践。只让事件处理函数本身接触到浏览器事件对象event,有利于降低代码耦合,方便独立测试及维护。

那么,功能越来越多,越来越复杂了会怎么样呢?如果沿用之前的做法,可能是这个样子:

虽然这样用也没问题,但这种时候其实就可以考虑更优雅的写法:

这种形式就是事件分发,请注意,这里的事件并不是指浏览器原生的事件(event对象),而是逻辑层面的自定义事件。上面的aya:clicked就是一个随便写(really&#;)的自定义事件名称。

显然到这还没结束,为了完成之前的复杂的功能,我们还需要将自定义事件和要做的事关联在一起:

看起来又绕了回来?没错,但这是有用的。一方面,浏览器原生事件的侦听被分离并固化了下来,以后如果逻辑功能有变化,例如减少几个功能,则只需要到自定义事件的关联代码部分做删减,而不需要再关心原生事件。另一方面,逻辑功能的调整变得更为灵活,可以在任意的代码位置通过subscribe添加功能,而且可以自行做分类管理(自定义的事件名)。

简单来说,事件分发通过增加一层自定义事件的冗余(在只有简单的逻辑功能时,你就会觉得它是冗余),降低了代码模块之间的耦合度,使得逻辑功能更为清晰有条理,便于后续维护。

等下,前面那个出境了好几次的很有存在感的amplify是干什么的?

Nice,终于是时候介绍这个了。AmplifyJS

事件分发是需要一定的方法来实现的。实现事件分发的设计模式之一,就是发布/订阅(Publish/Subscribe)。

AmplifyJS是一个简单的JavaScript库,主要提供了Ajax请求、数据存储、发布/订阅三项功能(每一项都可独立使用)。其中,发布/订阅是核心功能,对应命名是amplify.core。

Notice: Undefined index: CMSdown in /data/webroot/gcms/lib/Api/Open/Article.php on line img////_d3febcde5.jpg" alt="查看图片" />

amplify.core是发布/订阅设计模式的一个简洁的、清晰的实现,加上注释一共多行。读完amplify的源码,就可以比较好地理解如何去实现一个发布/订阅的设计模式。代码全貌

使用AmplifyJS组件配合JavaScript进行编程的指南(amp designer插件)

amplify.core的源码整体结构如下:

可以看到,amplify定义了一个名为amplify的全局变量(作为global的属性),它有3个方法publish、subscribe、unsubscribe。此外,subscriptions作为一个局部变量,它将保存发布/订阅模式涉及的所有自定义事件名及其关联函数。publish

publish即发布,它要求指定一个topic,也就是自定义事件名(或者就叫做话题),调用后,所有关联到某个topic的函数,都将被依次调用:

[1],参数topic必须要求是字符串,否则抛出一个错误。

[2],args将取得除topic之外的其他所有传递给publish函数的参数,并以数组形式保存。如果对应topic在subscriptions中没有找到,则直接返回。

[3],topicSubscriptions作为一个数组,取得某一个topic下的所有关联元素,其中每一个元素都包括callback及context两部分。然后,遍历元素,调用每一个关联元素的callback,同时带入元素的context和前面的额外参数args。如果任意一个关联元素的回调函数返回false,则停止运行其他的并返回false。subscribe

订阅,如这个词自己的含义那样(就像订本杂志什么的),是建立topic和callback的关联的步骤。比较特别的是,amplify在这里还加入了priority(优先级)的概念,优先级的值越小,优先级越高,默认是。优先级高的callback,将会在publish的时候,被先调用。这个顺序的原理可以从前面的publish的源码中看到,其实就是预先按照优先级从高到低依次排列好了某一topic的所有关联元素。

[1],要理解这一部分,请看amplify提供的API示意:

可以看到,amplify允许多种参数形式,而当参数数目和类型不同的时候,位于特定位置的参数可能会被当做不同的内容。这也在其他很多JavaScript库中可以见到。像这样,通过参数数目和类型的判断,就可以做到这种多参数形式的设计。

[2],订阅的时候,topic是允许空格的,空白符将被当做分隔符,认为是将一个callback关联到多个topic上,所以会使用一个循环。added用作标识符,表明新加入的这个元素是否已经添加到数组内,初始为false。

[3],每一个callback的保存,实际是一个对象,除callback外还带上了context(默认为null)和priority。

[4],这个循环是在根据priority的值,找到关联元素应处的位置。任何topic的关联元素都是从无到有,且依照priority数值从小到大排列(已排序的)。因此,在比较的时候,是先假设新加入的元素的priority数值较大(优先级低),从数组尾端向前比较,只要原数组中有关联元素的priority数值比新加入元素的小,循环就可以中断,且可以确定地用数组的splice方法将新加入的元素添加在此。如果循环一直运行到完毕,则可以确定新加入的元素的priority数值是最小的,此时added将保持为初始值false。

[5],如果到这个位置,元素还没有被添加,那么执行添加,切可以确定元素应该位于数组的最前面(或者是第一个元素)。unsubscribe

虽然发布和订阅是最主要的,但也会有需要退订的时候(杂志不想看了果断退!)。所以,还会需要一个unsubscribe。

读过前面的源码后,这部分看起来就很容易理解了。根据指定的topic遍历关联元素,找到callback一致的,然后删除它。由于使用的是splice方法,会直接修改原始数组,因此需要手工对i和length再做一次调整。Amplify使用示例

官方提供的其中一个使用示例是:

结合前面的源码部分,是否对发布/订阅这一设计模式有了更明确的体会呢?补充说明

你可能也注意到了,AmplifyJS所实现的典型的发布/订阅是同步的(synchronous)。也就是说,在运行amplify.publish(topic)的时候,是会没有任何延迟地把某一个topic附带的所有回调,全部都运行一遍。结语

Pub/Sub是一个比较容易理解的设计模式,但非常有用,可以应对大型应用的复杂逻辑。本文简析的AmplifyJS是我觉得写得比较有章法而且简明切题(针对单一功能)的JavaScript库,所以在此分享给大家。

怎么通过onclick事件获取js函数返回值(代码少) 具体过程不做详细叙述,直接上代码:写一个弹出框,绑定onclick事件是好像控制不了它的返回值。代码如下functioncreateBtn(){for(vari=0;i_this.btn.length;i++){varb

JavaScript编程中的Promise使用大全 尽管Promise已经有自己的规范,但目前的各类Promise库,在Promise的实现细节上是有差异的,部分API甚至在意义上完全不同。但Promise的核心内容,是相通的

小议JavaScript中Generator和Iterator的使用 一说到Generator,大家就会扯上异步之类是话题。这显然是被一些奇奇怪怪的东西带坏了。与Generator关系密切的应该是Iterator才对,拿Generator来处理异步也

标签: amp designer插件

本文链接地址:https://www.jiuchutong.com/biancheng/377574.html 转载请保留说明!

上一篇:解析JavaScript的ES6版本中的解构赋值(js excel解析)

下一篇:怎么通过onclick事件获取js函数返回值(代码少)(怎么通过微信号查到对方的手机号码)

  • 应交税费明细科目怎么记账
  • 企业所得税优惠政策最新2023小微企业
  • 低值易耗可以直接入管理费用吗
  • 个体工商户生产经营所得税税率表2021
  • 外包和离岸外包一样吗
  • 资产处置损益需要转营业外支出吗
  • 企业卫生费是指什么
  • 上季度开的发票这季度冲红怎么做会计分录?
  • 购买债券取得的利息收入计入什么科目
  • 公司土地被征收员工该怎么办
  • 装饰设计费计入什么科目
  • 业务有提成个税怎么扣
  • 支出没有发票怎么做账
  • 产品成本的计算公式
  • 个人终止投资经营怎么办
  • 个人取得的拆迁款需要缴纳个人所得税吗
  • 专家评审费如何报销费用
  • 小规模纳税人转成一般纳税人条件
  • 公司成立后一直没有收入
  • 人力成本包括哪三个方面
  • 1697508131
  • 地方教育附加可以在企业所得税前扣除吗
  • win10消费者版本和商业版本有什么区别
  • 事业单位会计凭证收入怎么记账
  • 会计管理制度范本
  • 公司预交一年的养老保险
  • 开票的附加税是多少
  • 美团佣金收费标准结构图
  • navapp.exe - navapp是什么进程文件 作用是什么
  • 向股东借款作为股东借款
  • 现在学修电脑怎么样
  • 零基础java从入门到精通
  • 提足折旧仍使用的逾龄房产是否交房产税
  • 缴纳租房押金会被骗吗
  • 关于政府的话
  • 成本会计工作流程表
  • 利用python自动填问卷
  • 财政专户资金是什么意思
  • php用在哪些方面
  • ConvNeXt V2学习笔记
  • nvm安装教程
  • b站导出预设
  • 装修费用当月摊还是次月摊销
  • 遥感图像超分辨率 坑
  • 进入微信小程序
  • Laravel 5.3 学习笔记之 安装
  • 不按发票金额付款说明
  • 将织梦dedecms转换到wordpress
  • 往期企业所得税报表更正
  • 固定资产的货币时间价值
  • sqlserver 2008数据库事务日志已满怎么处理
  • microsoft SQL server 2008有什么用
  • 确认营业收入的时间是什么简答题
  • 未达到起征点销售额写多少
  • 换下来的旧电池还有用吗
  • 签订三方协议是办理实时扣税的前提,这里三方是指
  • 购进商品印花税怎么计算
  • 代理赚差价违法吗
  • 预算会计年末如何结账
  • 短期借款明细账采用什么格式
  • 租写字楼水电费自己付吗
  • 业务招待费是销售
  • mysql查询语句大全讲解
  • mysql 5.7.18 winx64安装配置方法图文教程
  • win10应用商店应用少
  • 在windows上装ubuntu
  • 磁盘分区右键是灰色的
  • windows8 1
  • windows 7如何连接
  • cocos3.0
  • OpenGL_砖块着色案例
  • 获取android id
  • css回到页面顶部
  • JavaScript charCodeAt方法入门实例(用于取得指定位置字符的Unicode编码)
  • jquery全选和全不选效果
  • android 入门教程
  • 陕西电子税务局官网登录入口网址
  • 四川省网上税务局申报流程
  • 邮政银行开税票要什么材料
  • 广东省东莞市电子税务局官网
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设