import { isFn } from 'uni-shared' import { invokeMethod, getCurrentPageVm } from '../../platform' import { CanvasContext } from '../context/canvas' import { MapContext } from '../context/create-map-context' import { VideoContext } from '../context/create-video-context' import { EditorContext } from '../context/editor' const ContextClasss = { canvas: CanvasContext, map: MapContext, video: VideoContext, editor: EditorContext } function convertContext (result) { if (result && result.context) { const { id, name, page } = result.context const ContextClass = ContextClasss[name] result.context = ContextClass && new ContextClass(id, page) } } class NodesRef { constructor (selectorQuery, component, selector, single) { this._selectorQuery = selectorQuery this._component = component this._selector = selector this._single = single } boundingClientRect (callback) { this._selectorQuery._push( this._selector, this._component, this._single, { id: true, dataset: true, rect: true, size: true }, callback) return this._selectorQuery } fields (fields, callback) { this._selectorQuery._push( this._selector, this._component, this._single, fields, callback ) return this._selectorQuery } scrollOffset (callback) { this._selectorQuery._push( this._selector, this._component, this._single, { id: true, dataset: true, scrollOffset: true }, callback ) return this._selectorQuery } context (callback) { this._selectorQuery._push( this._selector, this._component, this._single, { context: true }, callback ) return this._selectorQuery } } class SelectorQuery { constructor (page) { this._page = page this._queue = [] this._queueCb = [] this._nodesRef = null } exec (callback) { invokeMethod('requestComponentInfo', this._page, this._queue, res => { const queueCbs = this._queueCb res.forEach((result, index) => { if (Array.isArray(result)) { result.forEach(convertContext) } else { convertContext(result) } const queueCb = queueCbs[index] if (isFn(queueCb)) { queueCb.call(this, result) } }) isFn(callback) && callback.call(this, res) }) return this._nodesRef } ['in'] (component) { // app-plus 平台传递 id this._component = component._$id || component return this } select (selector) { return (this._nodesRef = new NodesRef(this, this._component, selector, true)) } selectAll (selector) { return (this._nodesRef = new NodesRef(this, this._component, selector, false)) } selectViewport () { return (this._nodesRef = new NodesRef(this, 0, '', true)) } _push (selector, component, single, fields, callback) { this._queue.push({ component, selector, single, fields }) this._queueCb.push(callback) } } export function createSelectorQuery (context) { if (context) { return new SelectorQuery(context) } return new SelectorQuery(getCurrentPageVm('createSelectorQuery')) }