Amaple 拥有非常强大插件功能,这也是它的突出功能之一,Amaple插件一般表现为功能块(函数)或功能块(包含一系列函数和属性的Object对象),它除了支持Amaple规范定义的插件外,还支持所有 AMD (点击了解详情) IIFE (点击了解详情)规范的插件,在 rollup webpack browserify 等模块打包工具流行的今天,这也意味着几乎所有的第三方js库都可以与Amaple协同运作,同时也支持旧式的iife格式js库。

定义并安装Amaple规范的插件

在安装Amaple规范的插件前,我们需定义一个特定格式的pluginDefinition(插件定义对象)供Amaple安装,这个对象必须包含name属性和build函数,分别表示插件名与构建函数,此构建函数返回的值将作为插件实体。然后使用am.install(pluginDefinition)并传入插件安装对象pluginDefinition进行安装:

// 插件定义对象
const pluginDefinition = {
name : "switch", // 定义插件名,命名规则与变量名的规则相同 // 构建函数,它要求返回一个插件实体
// 无效返回值(undefined、null、0、false等)将会抛出错误
// build函数中的this指向的是am对象,所以你可以使用它进行组件定义或am属性的扩展
build : function () {
var state = "OFF"; return {
press: function () {
return state === "OFF" ? "ON" : "OFF";
}
};
}
}; // 调用后插件将会被安装,此时就完成了一个名为switch的插件
// 它是一个含有`press`函数的Object对象。
am.install (pluginDefinition);

在Amaple中,插件也可以像模块与组件文件一样编写在独立的js文件中,它也提供了相应的插件载入机制。如我们可将上面的插件定义代码单独放到/plugin/switch.js文件中。

载入插件

无论是 Amaple 规范、 amd iife 规范的插件在Amaple中都可以以单独文件的形式存在,对于这些插件我们需要载入它们才可使用,我们可在am.startRouter函数的参数内添加plugin属性指定项目依赖的插件路径信息,这样Amaple将会自动加载这些插件文件,plugin具体配置如下:

am.startRouter( {
// ...
baseURL : {
// ... // 可为插件文件设置base路径,所有的插件文件请求路径都将基于“/plugin”目录,不设置时默认为“/”
plugin: "/plugin"
}, // plugin的值为一个数组,通过它来指定项目中依赖的所有插件
// 以下分别表示插件载入的4种方式
plugin: [ // ①.插件路径字符串,适用于amaple规范的单独文件插件
// 如上面定义的switch插件可使用此方式载入,加载路径依赖baseURL
"siwtch", // ②.插件定义对象pluginDefinition,直接传入此对象后将会安装此插件
// 与amaple规范的单独文件插件相比,不需调用am.install函数。
// 这对于webpack等模块化环境下非常有用,你可以import任意js库并通过build函数retuen它进行安装
{ name: "switch", build: function () { ... } }, // ③.amd规范js库,支持amd规范的所有js库都可以这样载入并作为amaple的插件使用
// url依赖baseURL,且url值为“http://”、“https://”开头时可直接载入外网js库
{ format: "amd", name: "anime", url: "amd/animejs" }, // ④.iife规范js库,iife规范下将会使用global的值作为全局对象名,并在window对象下寻找它,未定义global时会使用name的值代替global值进行寻找
// url依赖baseURL,且url值为“http://”、“https://”开头时可直接载入外网js库
{ format: "iife", name: "lodash", global: "_", url: "iife/lodash" }
]
} );

【注意】虽然插件的载入是异步执行的,但请不必担心,它们会根据plugin数组按顺序进行安装,这对于拥有依赖的插件是很有用的,你可以在plugin属性中先载入被依赖的插件,这样,依赖它们的插件就可以顺利获取到它们了。

使用插件

被载入的插件可在模块、组件以及其他插件中使用,你可以在模块、组件的所有生命周期函数以及插件的build函数中直接通过插件名接收插件实体对象,这也是极为简单的,如在一个模块中使用 switch 插件:

new am.Module ( {

    // 使用插件名直接接收,switch插件将会自动注入到init、mounted函数中
// 其他生命周期函数中也使用此方法注入对应插件实体
init : function ( switch ) { ... },
mounted : function ( switch ) { ... },
// ...
} );

预定义插件

Amaple框架中有utilhttpeventpromise四个预定义插件,它们可以直接在生命周期函数中接收,而不需要在配置对象plugin属性中显式引入。

此小节主要介绍四个预定义插件的使用方法,但插件使用在Amaple中并不是必须的,所以如果你想更快看完此教程,可先跳过此小节的学习。

# 工具函数插件util

类型:Object

描述:

js工具函数集合

对象属性:

type(arg: any)
  • 类型:Function
  • 描述:判断数据类型,与“typeof”关键字相比,它还可以判断null和Array两个数据类型
  • 参数:

    • arg|any:需判断类型的数据
  • 返回值:传入参数的数据类型
foreach(target: ArrayLike|Object, callback: Function)
  • 类型:Function
  • 描述:循环遍历一个对象,使用方法与array.forEach类似。但它还可以遍历类数组如Node.childNodes、Node.attributes等,且当传入的参数不可遍历时将直接返回。参数callback为循环遍历时的回调函数,它分别接收遍历项的值、遍历下表、遍历变量本身三个参数,当回调函数返回false时将break结束本次循环,而且此时foreach执行结束后也将会返回一个false,这在结束多层循环遍历时很有用,开发者可以通过“return foreach(...)”再次推出上层循环。
  • 参数:

    • target|ArrayLike、Object:循环遍历的目标变量值
    • callback|Function:循环遍历时的回调函数,它分别接收遍历项的值、遍历下表、遍历变量本身三个参数,返回false可结束循环遍历
  • 返回值:无
isEmpty(object: Array|Object)
  • 类型:Function
  • 描述:判断一个数组或对象是否为空,检查对象时它只会检查该对象本身的成员属性
  • 参数:

    • object|Array、Object:待判断的数组会对象
  • 返回值:空时为true,不空时为false
isPlainObject (object: Object)
  • 类型:Function
  • 描述:判断一个对象是否为纯粹的Object数据对象
  • 参数:

    • object|Object:待判断对象
  • 返回值:是则返回true,不是则返回false
guid()
  • 类型:Function
  • 描述:获取唯一标识
  • 参数:无
  • 返回值:唯一标识

# Ajax插件http

类型:Object

描述:

Ajax网络请求插件,它的对象函数getpostrequest都实现了
Promise/A+规范,在定义回调函数上,除了普通的异步回调函数传参外,还支持使用链式调用的方式来实现异步回调函数的调用,例如http.get(...).done(function(result) {...}).fail(function(error){...})http.get(...).then(function(result){}, function(error){...}),来指定成功与失败的回调函数,如果在Promise对象上和回调函数传参上同时指定了回调函数,则会执行传参回调函数。成功回调函数successHandler将接收的参数为响应内容response、响应状态码status,响应状态内容statusText及自定义XHR对象amXHRamXHR对象属性详细如下:

  • setRequestHeader(header: String, value: String)

    • 描述:设置请求头,请求执行前设置有效
    • 参数:

      • header|String:请求头名称
      • value|String:请求头值
    • 返回值:无
  • getResponseHeader(header: String)

    • 描述:获取返回头信息,请求响应后可获取
    • 参数:

      • header|String:返回头名称
    • 返回值:对应的返回头信息
  • getAllResponseHeaders()

    • 描述:获取所有返回头信息,请求响应后可获取
    • 参数:无
    • 返回值:所有返回头信息
  • overrideMimeType(mimetype: String)

    • 描述:设置mimeType,请求执行前设置有效
    • 参数:

      • mimetype|String:mimeType值
    • 返回值:无
  • abort(statusText: String)

    • 描述:触发请求中断回调,在支持请求中断且请求响应前有效
    • 参数:

      • statusText|String:中断信息,开发者可在中断回调中的statusText获取到
    • 返回值:无

http插件对象函数:

get(url: String, args?: String|Object, callback?: Function, dataType?: String)
- 类型:Function
- 描述:执行Ajax GET请求,它将返回一个Promise对象用于以链式调用的方式来实现异步回调函数
- 参数:
- url|String:请求url
- args?|String、Object:get提交的数据,此参数传入String时以“k1=v1&k2=v2”的格式传入,传入Object时为一个数据对象
- callback?|Function:请求成功回调函数,。它
- dataType?|String:设置响应内容的格式,可选为“TEXT/JSON/SCRIPT/JSONP”(可忽略大小写),默认为“TEXT”
- 返回值:Promise对象
post(url: String, args?: String|Object, callback?: Function, dataType?: String)
- 类型:Function

- 描述:执行Ajax POST请求,它将返回一个Promise对象用于以链式调用的方式来实现异步回调函数
- 参数:
- url|String:请求url
- args?|String、Object:post提交的数据,此参数传入String时以“k1=v1&k2=v2”的格式传入,传入Object时为一个数据对象
- callback?|Function:请求成功回调函数,如果传入此参数则以它为回调函数执行。它将接收的参数为响应内容response、响应状态码status,响应状态内容statusText及自定义XHR对象amXHR
- dataType?|String:设置响应内容的格式,可选为“TEXT/JSON/SCRIPT/JSONP”(可忽略大小写),默认为“TEXT”
- 返回值:Promise对象
request(options: Object)
- 类型:Function
- 描述:执行Ajax请求,相比于get、post函数,它可以完成更复杂的请求操作,且此函数可直接在data属性中传入带有上传文件的form表单元素或FormData对象实现文件上传操作,当在低版本浏览器使用form表单元素上传时将自动使用隐藏iframe刷新的方式上传,但在支持FormData对象的浏览器中自动使用FormData对象实现文件上传
- 参数:
- options|Object:可选属性详情如下:
- method?|String:请求类型,GET或POST,大小写不敏感,默认为GET
- url|String: 请求地址
- data?|String:提交的额外参数,可选为格式为k1=v1&k2=v2的字符串、{k1:v1, k2:v2}的数据对象、FormData对象及form表单元素对象,当data为form对象时,如果也提供了src参数则优先使用src参数当做url进行提交
- async?|Boolean:是否异步请求,默认为true
- cache?|Boolean:请求缓存,如果为false,则每次都会发送请求,默认为true
- contentType|String:请求参数编码
- dataType?|String:返回的数据类型,TEXT/JSON/SCRIPT/JSONP,大小写不敏感,默认为TEXT
- username?|String:服务器认证用户名
- password?|String:服务器认证密码
- mimeType?|String:设置mimeType
- headers?|Object:额外的请求头信息,为一个对象
- timeout?|Number:请求超时时间
- beforeSend?|Function:请求发送前回调,函数参数为amXHR对象、当前配置对象options
- success?|Function:请求成功后回调,函数参数为data、statusText、amXHR对象
- error?|Function:请求失败后回调,函数参数为amXHR对象、statusText
- complete?|Function:请求完成后回调,函数参数为amXHR对象、statusText
- abort?|Function:请求中断后回调,函数参数为statusText
- 返回值:Promise对象

# 自定义事件插件event

类型:Object

描述:

自定义事件对象,支持跨模块触发事件

对象函数:

on(types: String, listener: Function, once?: Boolean)
  • 类型:Function
  • 描述:绑定自定义事件,参数types以空格分隔开可同时绑定一个回调函数到多个事件类型上
  • 参数:

    • types|String:自定义事件名称,使用空格隔开可同时绑定一个监听函数到多个事件类型上listener|Function:事件回调函数
    • once?|Boolean:是否只能触发一次,设置为true时,触发一次回调后将自动解除绑定
  • 返回值:无
emit(types: String)
  • 类型:Function
  • 描述:触发自定义事件,当一个事件有多个回调函数时触发后将顺序执行多个回调函数
  • 参数:

    • types|String:自定义事件名称,使用空格隔开可同时触发多个事件
  • 返回值:无
remove(types: String, listener: Function)
  • 类型:Function
  • 描述:解绑事件,可一次解绑多个类型的事件
  • 参数:

    • types|String:自定义事件名称,使用空格隔开可同时解绑多个事件
    • listener|Function:事件回调函数,必须与绑定事件时传入的回调函数相同才可成功解绑
  • 返回值:无

# 异步操作同步化插件promise

类型:Class

描述:

Promise/A+规范 规范实现类,用于以同步的方式去执行回调函数,而不用将回调函数传入执行函数中,更加符合逻辑,且在需要执行多重回调处理时,以链式结构来表示函数处理后的回调。

成员函数:

then(onFulfilled: Function, onRejected?: Function)
  • 类型:Function
  • 描述:指定成功与失败的回调函数,返回值为Promise对象,如果有多重异步回调则可以在此函数后继续链式调用来指定后续的异步回调函数
  • 参数:

    • onFulfilled|Function:成功时的回调函数
    • onRejected?|Function:失败时的回调函数
  • 返回值:Promise对象
done(onFulfilled: Function)
  • 类型:Function
  • 描述:指定成功的回调函数,相当于调用then函数只传入有效的成功回调
  • 参数:

    • onFulfilled|Function:成功时的回调函数
  • 返回值:Promise对象
fail(onRejected: Function)
  • 类型:Function
  • 描述:指定失败的回调函数,相当于调用then函数只传入有效的失败回调
  • 参数:

    • onRejected|Function:失败时的回调函数
  • 返回值:Promise对象
always(callback: Function)
  • 类型:Function
  • 描述:绑定执行完成的回调函数,无论执行函数成功与失败都将调用此方法绑定的回调函数
  • 参数:

    • callback|Function:执行完成的回调函数
  • 返回值:Promise对象

继续学习下一节:【AmapleJS教程】6. 路由配置
也可回顾上一节:【AmapleJS教程】4. 组件

【Amaple教程】5. 插件的更多相关文章

  1. 【Amaple教程】4. 组件

    在Amaple单页应用中,一个页面其实存在两种模块化单位,分别是 模块 (am.Module类),它是以web单页应用跳转更新为最小单位所拆分的独立块: 组件 (am.Component类),它的定位 ...

  2. 【Amaple教程】6. 路由配置

    在 第1节<启动路由> 章节中为了能让单页应用顺利跑起来,我们提前介绍了简单的路由配置方法.我们已了解路由配置的目的是指定不同的url下对应的 模块节点(也叫做模块容器)内应该显示哪个模块 ...

  3. WordPress插件开发实例教程 - 版权插件

    说明:本教程仅限学习,高手请绕道 开发程序:WordPress 3.9-RC1 使用主题:Twenty Fourteen 在开始之前,需要注意三件事情 I.给插件取一个个性化的名字,越个性化越好,以防 ...

  4. 【Amaple教程】3. 模板指令与状态数据(state)

    一个模块的template模板.JavaScript和css之间的关系其实可以如下图表示: 如果你了解Angular.Vue动态模板,那你将会对Amaple的模板感到很熟悉,在Amaple中,temp ...

  5. 【Amaple教程】2. 模块

    正如它的名字,模块用于amaplejs单页应用的页面分割,所有的跳转更新和代码编写都是以模块为单位的. 定义一个模块 一个模块由<module>标签对包含,内部分为template模板.J ...

  6. WordPress插件制作教程(七): 插件函数之过滤器(Filter)函数

    上一篇对插件函数之动作(Action)函数做了下介绍,这篇在介绍下过滤器(Filters). 过滤器是一类函数,WordPress执行传递和处理数据的过程中,在针对这些数据做出某些动作之前的特定运行( ...

  7. WordPress插件制作教程(六): 插件函数之动作(Actions)函数

    这一篇为大家说一下WordPress插件函数吧,要制作插件,了解这些函数是非常有必要的 WordPress插件函数分为“动作”(Actions)和过滤器”(Filters),WordPress 使用这 ...

  8. 前端神器-神级代码编辑软件Sublime Text下载、使用教程、插件推荐说明、全套快捷键

    Sublime Text 是一个代码编辑器,也是HTML和散文先进的文本编辑器.Sublime Text是由程序员Jon Skinner于2008年1月份所开发出来,它最初被设计为一个具有丰富扩展功能 ...

  9. gitbook 入门教程之插件介绍

    插件是 gitbook 的扩展功能,很多炫酷有用的功能都是通过插件完成的,其中插件有官方插件和第三方插件之分. 推荐官方插件市场 https://plugins.gitbook.com/ 寻找或下载相 ...

随机推荐

  1. 腾讯云 Serverless 首发 1ms 计费粒度,立省 70% 费用

    云函数 SCF 采用按需付费的方式,并首次发布 1ms 计费粒度,真正实现按使用多少计算能力来计费. 云函数(Serverless Cloud Function,SCF)是腾讯云为企业和开发者们提供的 ...

  2. 关于vyos 防火墙配置

    VyOS是一个基于Debian的网络操作系统,是Vyatta的社区fork.Vyatta是博通的企业级的产品,通过这套系统,能在x86平台提供路由,防火墙和×××的功能. 这个系统提供了和其他诸如Ci ...

  3. redHat更新yum源

    1. 网易镜像仓库查找相关rpm 包并下载 :http://mirrors.163.com/centos/6/os/x86_64/Packages/ wget http://mirrors.163.c ...

  4. [LC] 77. Combinations

    Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. Example: I ...

  5. ServletContextListener 监听器

    Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码.做一些业务逻辑判断等.其工作原理是,只要你在web.xml文件配置好要 ...

  6. js原型理解

    https://www.cnblogs.com/liuhw/p/10646717.html __proto__的默认指向:https://www.jianshu.com/p/686b61c4a43d

  7. 整理struct sockaddr和struct sockaddr_in

    struct sockaddr定义在/usr/include/linux/socket.h struct sockaddr { unsigned short ss_family; - } struct ...

  8. Golang Interface 解析

    转自 https://zhuanlan.zhihu.com/p/27652856 先看一段代码: 123456789101112 func (x interface{}) { if x == nil ...

  9. Spring Boot 集成 Spring Security

    1.添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  10. Spring Security基本原理

    近期研究了Spring Security,现进行记录. 首先先进行一个最简单的demo.默认情况下,在Spring Boot里,如果在classpath下面有Spring Security相关的jar ...