ajax
简介
插件名称: ajax (适配 jQuery 风格,集成 jsonp 和 ajax
插件配置: {Object}
基本配置如下:
{
"charset": "UTF-8",
"timeout": 30 * 1000,
"argsType": "query",
"method": "get",
"isEncode": false,
"responseType": "json",
"withCredentials": false
}
配置参数:
url:{String}请求地址。bizType:{String}业务中默认参数设置。默认false。charset:{String}编码。默认UTF-8。timeout:{Number}请求超时时间。默认30 * 1000。data:{Object}请求参数。argsType:{String}请求参数类型。可选值:query和json。默认query。method:{String}请求方式。默认get。headers:{Object}请求头信息。isEncode:{Boolean}否是编码。默认false。dataType:{String}返回数据的数据类型。默认json。cache:{Boolean}是否允许缓存。默认false。withCredentials:{Boolean}是否带有验证信息。默认false。jsonp:{String}为 jsonp 请求重写回调函数名对应的 key。这个值用来替代在 url 中"callback=?"的"callback"部分。jsonpCallback:{String}为 jsonp 请求指定一个回调函数名。这个值将用来取代自动生成的随机函数名。success:{Function}请求成功后的函数调用。error:{Function}请求失败后的函数调用。onAbort:{Function}取消请求后的函数调用。onFail:{Function}请求失败后的函数调用。
添加的方法
QApp.ajax.setBizOptions(key, opt)
说明:设置业务的基本参数
参数:
key:{String|Object}业务参数关键字。当key类型为字符串时,以key-value的形式进行设置;key类型为Object时,将对象作为参数对象进行添加opt:{String|Undefined}业务参数值
QApp.ajax.addMock(key, mock)
说明:mock数据
参数:
key:{String|Object}key类型为String时,为mock数据的关键字;key的类型为Object时,表示mock数据对象。mock:{Object}mock数据
QApp.ajax.addReqFilter(filter)
说明:添加请求参数的过滤函数
参数:
filter:{Function}过滤函数
QApp.ajax.removeReqFilter(filter)
说明:移除某个请求时的过滤参数
参数:
filter:{Function}过滤函数
QApp.ajax.addRespFilter(filter)
说明:添加数据的过滤函数
参数:
filter:{Function}过滤函数
QApp.ajax.removeRespFilter(filter)
说明:移除数据的过滤函数
参数:
filter:{Function}过滤函数
使用示例
// 在defineView时,plugins 内添加 ajax
// 正常的 ajax 请求
var ajaxDeferred = self.ajax({
url: requestURL
}).done(function (data) {
// TODO
}).fail(function () {
// TODO
}).all(function (){
// TODO
})
// 取消
ajaxDeferred.trans.abort()
本地mock数据
QApp-plugin-ajax 插件提供本地 mock 数据的功能,使用方法:
// 添加 mock 数据方式
// QApp.ajax.addMock("key", data); or
QApp.ajax.addMock({
"key" : data
});
self.ajax({
mockKey: "key",
mock: true,
url: requestURL
}).done(function (data) {
// TODO
});
添加过滤函数
// 添加请求过滤函数
QApp.ajax.addReqFilter(function(opt, deferred) {
// 如果通过 view.ajax 方式使用 ajax,
// 通过以下方式获取 view
// opt.__view
})
// 添加数据过滤函数
QApp.ajax.addRespFilter(function(data, err, opt, deferred) {
if (err) {
switch(err.type) {
case 'Timeout':
// 超时
break;
case 'Abort':
// 取消
break;
case 'Fail':
// 失败
break;
default:
// 其他。目前只有上面三种出错情况
}
}
})
artTemplate
简介
插件名称: artTemplate
重写或添加的方法
添加的方法 renderData(key, data, container, appendType)
- Param
key:{String}关键字 - Param
data:{Object}渲染数据 - Param
container:{String}node的选择器 - Param
appendType:{String}插入位置设置,值为beforebegin(插入目标节点前)、afterbegin(插入到目标节点的第一个子节点前)、inner(替换目标内子元素)、beforeend(插入到目标节点的最后子节点之后)、afterend(插入到目标节点之后)
示例
QApp.defineView('name' {
html: '<p>{{name}}</p>',
plugins: [{
name: 'artTemplate',
options: {
global: {
data: {'name': 'david'}
}
}
}]
});
// 动态渲染
QApp.defineView('pageA.pageA-1', {
html: html,
plugins: [{
name: 'artTemplate',
options: {
key: {
template : tpl,
container : '[node-type=hoganContainer]',
appendType : 'inner'
}
}
}],
init: {
myFunc: function() {
this.renderData('key', { // render data
data: data
});
}
}
});
avalon
简介
插件名称: avalon
插件配置:Function 或者 Map<String, Function>
- 当配置为
Function时,则是一个factory, 然后以View的root为根节点,并在其上自己添加ms-controller, 并scan。 - 当配置为
Map时,则是多个factory,相应的key则是其id,需要用户自己在模板上添加ms-controller。
注:
avalon的factory没有绑定context (this)。- 插件将
context (this)设置成当前的View实体。
示例:
{
name: 'avalon',
options: function(vm) {
//TODO
}
}
在 View 的 extra 配置中配置 vmcache 可开启 vm 缓存功能。
重写或添加的方法
添加的方法: getVM(key)
- Param
key:{Undefined|String}关键字 - Return
{VModel} - 当包含单一的
vm时,用getVM()获取;如果是包含多个vm时,用getVM(key),key为vm的id。
重写的方法: mergeParam(newParam)
- 逻辑和原来一样,增加了更改
vm的逻辑。
重写的方法: destory()
- 和原来逻辑一样,增加了序列化保存
vm的逻辑。
其他事宜
重写了 QApp.addWidget 方法,对于此方法的说明,详见 widget.md。
作用是,将注册到 QApp 的组件,同时注册到 avalon 组件内。可以使用 ms-widget=qapp-组件名 的形式调用,主要解决,avalon 的 vm 更改,影响到 Dom 增添时,会触发组件的逻辑。
basic
简介
插件名称: basic
基础插件组,主要用于视图的展现效果, 通过 open 和 show 中配置 ani 使用, 其中包括 dialog, actionSheet, popup 三个动画插件。
PS: moveEnter 插件放到 QApp 核心包内,作为默认效果。
MoveEnter 插件说明
插件名称: moveEnter
插件配置:{Object}
基本配置如下:
{
"autoHide": true,
"position": "right",
"distance": 0,
"duration": 300
}
配置参数:
autoHide:{Boolean}是否自动隐藏。 默认true。position:{String}从何方移入。 默认right。可能的值right|leftdistance:{Number}移入距离。 默认0。 (如果为0, 自动获取视图的对应尺寸作为distance, 当App的type为mobile时,默认全屏尺寸)duration:{Number}动画效果时长。 默认300。
重写或添加的方法
重写 show 和 hide 方法,两个方法均没参数。
Dialog 插件说明
插件名称: dialog
插件配置:{Object}
基本配置如下:
{
"autoHide": false,
"maskColor": "#000",
"maskOpacity": "0.4",
"duration": 200,
"width": 0,
"height": 0
}
配置参数:
autoHide:{Boolean}是否自动隐藏。 默认false。maskColor:{String}蒙层颜色。 默认#CCC。maskOpacity:{String}蒙层透明度。 默认0.5。duration:{Number}动画效果时长。 默认300。width:{Number}dialog宽度。 默认0。(如果为0, 自动获取视图的宽度)height:{Number}dialog高度。 默认0。(如果为0, 自动获取视图的高度)
重写或添加的方法
重写 show 和 hide 方法,两个方法均没参数。
Popup 插件说明
插件名称: popup
插件配置:{Object}
基本配置如下:
{
"autoHide": true,
"autoDirection": true,
"direction": "right",
"duration": 100,
"width": 0,
"height": 0,
"position": "center"
}
配置参数:
autoHide:{Boolean}是否自动隐藏。 默认true。autoDirection:{Boolean}自动选择方向。 默认true。direction:{String}从何方移入。 默认right。可能的值right|left|top|bottomduration:{Number}动画效果时长。 默认100。width:{Number}popup宽度。 默认0。height:{Number}popup高度。 默认0。position:{String}上下显示时的居中情况。 默认center。可能的值center|right|left
重写或添加的方法
重写 show 和 hide 方法,show方法有参数,要指定显示时相对应的 element。
ActionSheet 插件说明
插件名称: actionSheet
插件配置:{Object}
基本配置如下:
{
"autoHide": true,
"distance": 0,
"duration": 200,
"showMask": true,
"maskColor": "#000",
"maskOpacity": "0.4"
}
配置参数:
autoHide:{Boolean}是否自动隐藏。 默认false。distance:{Number}移入距离。 默认0。duration:{Number}动画效果时长。 默认200。showMask:{Booleamn}是否显示蒙层。 默认true。maskColor:{String}蒙层颜色。 默认#000。maskOpacity:{String}蒙层透明度。 默认0.4。
重写或添加的方法
重写 show 和 hide 方法,两个方法均没参数。
添加 refresh 方法,在 view 高度发生变化时刷新 view。
delegated
简介
插件名称: delegated
插件配置:{Object}
默认配置如下:
{
"tag": "action-type",
"eventType": "tap"
}
配置参数:
tag:{String}监听DOM中具有action-type属性的节点。eventType:{String}事件类型,默认为tap事件。
重写或添加的方法
添加的方法: bind(action, eventType, process)
- Param
action:{String}监听关键字 - Param
eventType:{String|Function}事件类型或处理函数 - Param
process:{Function}处理函数 - Return
{Undefined}
示例
QApp.defineView('name' {
html: '<p action-type="abc" data-arg="xyz">Some</p><p action-type="def" data-arg="xyz">Any</p>',
plugins: [{
name: 'delegated',
options: {
tag: 'action-type',
eventType: 'tap'
}
}],
ready: function() {
this.bind('abc', function(e, data) {
// data.arg === 'xyz'
});
},
bindActions: {
'def' : function(e, data) {
// data.arg === 'xyz'
}
}
});
doms
简介
插件名称: doms
配置参数:
tag:{String}查找DOM中具有相同属性的节点,并建立以值建立映射。默认为node-type。
说明:
通过 view.doms 访问属性为 tag 的节点。
重写或添加的方法
添加的方法: find(type)
- Param
type:{String}node-type属性值
在 view 的 ready 事件阶段后,可以通过view.find方法快速访问 node 节点。
示例
QApp.defineView('name' {
html: '<p node-type="abc">Some</p>',
plugins: [{
name: 'doms',
options: {
tag: 'node-type'
}
}],
init: {
pHandler: function(event) {
// this.doms.abc === <p/>
}
},
ready: function() {
var p = view.find('abc'), // p === <p />
self = this;
p.addEventListener('tap', self.pHandler, false)
}
});
fastclick
简介
插件名称: fastclick (移动端快速点击)
说明
在视图 View 展现时,给视图增加 fastclick 机制。
gesture
简介
插件名称: gesture (手势库)
说明
现在支持轻触(tap),双轻触(doubletap),长按(press),快滑(flick),滑动(pan)。
扩展支持双指缩放(pinch)。
事件名和参数
对于每个事件,事件对象里都有以下属性:screenX, screenY, clientX, clientY, pageX, pageY。
- 轻触 :
tap - 双轻触 :
doubletap - 长按 :
press、pressend - 触摸 :
feel - 轻滑 :
flick| 拓展属性:offsetX、offsetY、speedX、speedY、duration、degree、directions - 滑动 :
pan、panend| 扩展属性:offsetX、offsetY、degree、directions|panend包含扩展属性:speedX、speedY、duration - 缩放 :
pinch、pinchend| 扩展属性:scale
事件触发说明:
tap / doubletap / press / feel 触按事件
- 用户触碰屏幕,并且位移距离小于 10,则会判定为触按事件。
- 用户开始触碰屏幕和结束触碰直接时差小于 200ms ,则会被判定为tap事件,反之被判定为press事件。
- tap和press事件 不会被同时触发 。
- 如果两次tap事件的时间差小于 500ms,则会被判定为doubletap事件。
- doubletap事件和tap事件 会同时触发,doubletap会在第二次tap事件 之前 触发。
- feel即触即触发,和tap、press并行。
flick / pan 滑动事件
- 用户点击屏幕,并且位移距离大于 10,则会判定为滑动事件。
- 用户开始触碰屏幕和结束触碰直接时差小于 300ms ,则会被判定为flick事件。
- flick和press事件 会被同时触发 。
- flick会在pressend事件 之后 触发。
- degree属性基准为水平向右坐标轴,顺时针方向,单位是 角度。
- directions为滑动方向,为一个 数组:
- 元素值为:
up、down、left、right; - 第一个元素为 主方向,第二个元素是 副方向;
- 当实际方向与主方向的夹角小于 15度 时,不存在副方向。
- 元素值为:
pinch 缩放事件
- 用户双指点击屏幕,并且移动,直接距离变化量大于 10,则会判定为缩放事件。
globalContext
简介
插件名:globalContext
全局工具类插件,本地存储组件。本插件提供两种版本的本地存储,请根据使用环境选择。
使用方式
1. 直接使用localStorage
QApp.util.storage(key[, value])
说明:存/取/删除单条数据
- 获取数据:只有 一个参数 时,为
get方法。 - 设置数据:有 多个参数 时,为
set方法;第二个参数value支持任何类型的值。 - 删除数据:
value为undefined或null为删除操作。
QApp.util.storage.clear();
说明:清除所有数据
2. 使用globalContext
使用场景:
SPA/多webview项目里,数据传递、数据共享等运行时数据。
注意事项:
该种存取数据的方法来源于SPA项目:在一个页面中,经常有一些运行时数据来进行数据传递或共享,所以是存放在内存中的。但是,到了大客户端/独立客户端的 多webview 时代, webview之间无法共享内存,所以在webview之间这些运行时数据需要通过localStorage来进行中转。即:这些数据在单个webview/SPA内还是存储在内存中,而在页面之间,通过localStorage将这些数据重新同步到不同的内存中。之所以没有用localStorage来直接取代内存,是因为ls的读写是阻塞式的读写文件,对于一些存取频繁的数据进行操作,效率还是较差。
重要:在多webview环境时,需要在初始化的时候,通过 QApp.util.globalContext.addLocalKeys 来指定哪些数据是需要在webview之间传递的,本插件会自动来进行数据同步。
QApp.util.globalContext.addLocalKeys(key)
说明:添加需要在webview之间同步的数据的key
QApp.util.globalContext.set(key, value)
说明:设置数据
QApp.util.globalContext.get(key)
说明:获取数据
QApp.util.globalContext.merge(key, value)
说明:merge数据
QApp.util.globalContext.remove(key)
说明:删除一条数据
QApp.util.globalContext.clear(key)
说明:清空所有数据
hogan
简介
插件名称: hogan
插件配置:{Object|Function}
- 当为
Function时,执行结果为配置,并且方法context为此视图View示例。 - 配置有两个属性,
data为模板数据,options为hogan配置。
重写或添加的方法
添加的方法 renderData(key, data, hoganOpt, container, appendType)
- Param
key:{String}关键字 - Param
data:{Object}渲染数据 - Param
hoganOpt:{Object}参数对象 - Param
container:{String}node的选择器 - Param
appendType:{String}插入位置设置,值为beforebegin(插入目标节点前)、afterbegin(插入到目标节点的第一个子节点前)、inner(替换目标内子元素)、beforeend(插入到目标节点的最后子节点之后)、afterend(插入到目标节点之后)
示例
QApp.defineView('name' {
html: '<p>{{name}}</p>',
plugins: [{
name: 'hogan',
options: {
global: {
data: {'name': 'david'}
}
}
}]
});
// 动态渲染
QApp.defineView('pageA.pageA-1', {
html: html,
plugins: ['hogan'],
hoganOptions: {
// 模板配置
key: {
template : tpl,
container : '[node-type=hoganContainer]',
appendType : 'inner'
}
},
init: {
myFunc: function() {
this.renderData('key', {
data: data // hogan data
});
}
}
});
scroll
简介
插件名:scroll (同时包含scroll组件)
说明:滚动插件,对 iScroll 进行封装,包含 nScroll 和 avalon.iscroll,并包括 scroll 组件。
QApp 中滚动依赖库为 iScroll, 版本是 probe 5.1.3 版,文档 iscrolljs.com。
希望使用 scroll 的同学可以了解一下 iscroll,这个组件是世界上最好的前端滚动组件,没有之一。
这里列一下 iscroll 必须 注意 的问题:(一般情况)
- 滚动的父容器,同时也是
iScroll配置的第一个参数el,此元素必须是可单独计算高度的,也就是不依赖于内部元素的。(当然你横向滚动时,需要的是宽度) - 父容器应该是
overflow:hidden的,这样可以显示成内部区域可滚动。 - 父容器需包含一个子节点
container用来滚动,这是iScroll约定的,这个节点的size是滚动计算的依据。
对于目前业务中的可动态加载的大列表,进行了优化,添加了懒加载功能。
使用的是基于iscroll自己编写的nscroll组件。
如何使用
最常用的方式是通过组件的方式。
开发者可以用在父容器上添加 qapp-widget="scroll" 的方式使用,此时父容器需要定高。
有关Avalon
由于业务中多使用 avalon ,所以自己额外开发了avalon.iscroll组件。
对于avalon.iscroll的说明如下:
- 添加
ms-iscroll命令, 值为id, opt, 和avalon.oniui类似。
如果使用加载功能:
dom需要结构与iscroll相同,因此,孙子节点应该是ms-repeat元素。- 因为要计算位置,所以每个元素的初始位置都应该是
(0, 0),不论怎么实现(absolute或使用margin进行偏移)。 - 在定义
vm时,如果是循环元素是list,那么需要用户主动添加僵尸元素list$。