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) } } }