智能照明系统APP-本地串口
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
LightingSystemApp-serial/.svn/pristine/a4/a4755e6393741ed22e4ad97b5b3...

115 lines
2.5 KiB

import {
isFn
} from 'uni-shared'
const SUCCESS = 'success'
const FAIL = 'fail'
const COMPLETE = 'complete'
const CALLBACKS = [SUCCESS, FAIL, COMPLETE]
/**
* 调用无参数,或仅一个参数且为 callback 的 API
* @param {Object} vm
* @param {Object} method
* @param {Object} args
* @param {Object} extras
*/
export function invokeVmMethodWithoutArgs (vm, method, args, extras) {
if (!vm) {
return
}
if (typeof args === 'undefined') {
return vm[method]()
}
const [, callbacks] = normalizeArgs(args, extras)
if (!Object.keys(callbacks).length) {
return vm[method]()
}
return vm[method](normalizeCallback(method, callbacks))
}
/**
* 调用两个参数(第一个入参为普通参数,第二个入参为 callback) API
* @param {Object} vm
* @param {Object} method
* @param {Object} args
* @param {Object} extras
*/
export function invokeVmMethod (vm, method, args, extras) {
if (!vm) {
return
}
const [pureArgs, callbacks] = normalizeArgs(args, extras)
if (!Object.keys(callbacks).length) {
return vm[method](pureArgs)
}
return vm[method](pureArgs, normalizeCallback(method, callbacks))
}
export function findElmById (id, vm) {
const elm = findRefByElm(id, vm.$el)
if (!elm) {
return console.error('Can not find `' + id + '`')
}
return elm
}
function findRefByElm (id, elm) {
if (!id || !elm) {
return
}
if (elm.attr && elm.attr.id === id) {
return elm
}
const children = elm.children
if (!children) {
return
}
for (let i = 0, len = children.length; i < len; i++) {
const elm = findRefByElm(id, children[i])
if (elm) {
return elm
}
}
}
function normalizeArgs (args = {}, extras) {
const callbacks = Object.create(null)
const iterator = function iterator (name) {
const callback = args[name]
if (isFn(callback)) {
callbacks[name] = callback
delete args[name]
}
}
CALLBACKS.forEach(iterator)
extras && extras.forEach(iterator)
return [args, callbacks]
}
function normalizeCallback (method, callbacks) {
return function weexCallback (ret) {
const type = ret.type
delete ret.type
const callback = callbacks[type]
if (type === SUCCESS) {
ret.errMsg = `${method}:ok`
} else if (type === FAIL) {
ret.errMsg = method + ':fail' + (ret.msg ? (' ' + ret.msg) : '')
}
delete ret.code
delete ret.msg
isFn(callback) && callback(ret)
if (type === SUCCESS || type === FAIL) {
const complete = callbacks.complete
isFn(complete) && complete(ret)
}
}
}